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
一、首先當然得去阿裡雲申請移動熱修複啦,
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL61EVOd3Z65UeJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyAjM3AjM0MTMwIjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
然後添加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,弄得腦袋瓜子都不好使了。