APP上线了,妈呀,几个bug测试没测出来,真TM蛋疼,又得重新打包审核提交上线,受不了,于是研究下热更新。
具体了解了下,目前比较火的热修复方案主要有:
1、阿里系:Sophix、AndFix 。
2、腾讯系:Tinker。
3、美团系:Robust。
这里我就从阿里的Sophix着手。
阿里云热修复的快速入门:https://help.aliyun.com/document_detail/53238.html?spm=a2c4g.11186623.6.556.1f9f5cbcoQJtA4
一、首先当然得去阿里云申请移动热修复啦,
然后添加Demo
点击应用信息获取需要在Manifest中配置参数App ID、App Secret、RSA密钥
其他的配置可以看看阿里云热修复的说明文档。
下面就说一下android studio的一些关键配置,
1、SophixApplication的初始化,
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex,需要在此处调用。
// MultiDex.install(this);
initSophix();
}
@Override
public void onCreate() {
super.onCreate();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
/** 补丁在后台发布之后, 并不会主动下行推送到客户端, 客户端通过调用queryAndLoadNewPatch方法查询后台补丁是否可用*/
SophixManager.getInstance().queryAndLoadNewPatch();
}
private void initSophix() {
String appVersion = "1.0";
try {
appVersion = this.getPackageManager()
.getPackageInfo(this.getPackageName(), 0)
.versionName;
} catch (Exception e) {
}
final SophixManager instance = SophixManager.getInstance();
Log.e("lin", "appVersion= " + appVersion);
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.e(TAG, "sophix load patch success!");
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 如果需要在后台重启,建议此处用SharePreference保存状态。
Log.e(TAG, "sophix preload patch success. restart app to make effect.");
} else {
Log.e("lin", "code= " + code);
Log.e("lin", "mode= " + mode);
Log.e("lin", "info= " + info);
Log.e("lin", "handlePatchVersion= " + handlePatchVersion);
}
}
}).initialize();
}
// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
@Keep
@SophixEntry(MyRealApplication.class)
static class RealApplicationStub {
}
}
关键位置在MyRealApplication,MyRealApplication其实就是自定义的Application,
public class MyRealApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.e("lin", "MyRealApplication start" );
}
}
但是在清单文件配置的确是SophixStubApplication,具体为什么要这么配置,我还得去研究。
剩下看阿里云的配置文档应该都会。
开始热修复吧。。。。
热修复之前页面就一个TextView,赋值修复前,热修复后的代码就在Activity给TextView赋值修复后,分别打包。用Windows版本打包工具地址:https://link.juejin.im/?target=http%3A%2F%2Fams-hotfix-repo.oss-cn-shanghai.aliyuncs.com%2FSophixPatchTool_windows.zip
使用该工具就生成了差异jar包,这就是热修复的代码(补丁包),然后阿里云热修复后台上传补丁包,
应用版本号应该和app的build.gradle版本号一致,上传成功后先不急发布,先本地测试下,
- 下载安装HotFix 调试工具。
- 使用HotFix 调试工具获取补丁;
- Android调试工具使用说明。
- 本地测试好后再发布。
MMP,感觉写的好稀烂,整天写Code,弄得脑袋瓜子都不好使了。