对比各种热修复技术和开发难度,我最终选择了Sophix
接入之前先了解一下Sophix文档:
阿里热修复:https://www.aliyun.com/product/hotfix
快速接入直通车:https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11174283.3.1.D6UW0D
稳键接入直通车:https://help.aliyun.com/document_detail/61082.html?spm=a2c4g.11186623.6.547.ArjpX7
我在项目里使用的是 稳键接入 下面介绍 稳键接入 的流程
1.在app中gradle文件中添加(仓库)
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
2.然后在app的build.gradle里面添加依赖:
compile'com.aliyun.ams:alicloud-android-hotfix:3.1.3'
注意,若SDK集成过程中出现UTDID冲突,请参考:https://help.aliyun.com/knowledge_detail/59152.html
(我接入友盟sdk,造成了UTDID冲突,原因是友盟sdk和SopHix有重复的东西)
3.稳健接入需要加入一个SophixStubApplication 的类
这里有一点需要注意SophixStubApplication 类里有个 括号里写原来自己的Application名字
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
import com.jiaoyu.utils.ILog;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此处SophixEntry括号里面应填写原来的的Application,并且保证RealApplicationStub类名不被混淆。
@Keep
@SophixEntry(Application.class)
static class RealApplicationStub {
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex,需要在此处调用。
// MultiDex.install(this);
initSophix();
}
private void initSophix() {
//你的后台版本,和控制台版本一样
String appVersion = "2.4.4";
try {
appVersion = this.getPackageManager()
.getPackageInfo(this.getPackageName(), 0)
.versionName;
} catch (Exception e) {
}
final SophixManager instance = SophixManager.getInstance();
instance.setContext(this)
.setAppVersion(appVersion)
.setSecretMetaData(null, null, null)
.setEnableDebug(true)
.setEnableFullLog()
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
Log.i(TAG, "sophix load patch success!");
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 如果需要在后台重启,建议此处用SharePreference保存状态。
//必须使用原生的SharePreference
Log.i(TAG, "sophix preload patch success. restart app to make effect.");
}
}
}).initialize();
}
}
4.之后我们在配置下刚才新写的SophixStubApplication类
<application
android:name="com.XX.XXXX.SophixStubApplication"
总结一下:
把此SophixStubApplication入口类添加进项目中,所有Sophix相关初始化放在此类中。并且不应包含开发者的任何业务逻辑代码。 若使用了MultiDex,也应在SophixStubApplication的initSophix之前添加,并且需要记得在原来的Application里面去除MultiDex,避免重复调用导致问题。
把RealApplicationStub的SophixEntry注解的内容改为自己原先真正的MyRealApplication类
AndroidManifest里面的application改为新增的SophixStubApplication入口类
在AndroidManifest.xml中间的application节点下添加如下配置:
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密钥" />
将上述value中的值分别改为通过平台HotFix服务申请得到的App Secret和RSA密钥
5.混淆配置
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
至此配置完成