Android熱修復方案有很多種,但都存在一個致命問題,沒有管理后臺可以上傳補丁包,所以都淘汰了。

還有一款還能用:阿里云Sophix
不知道其他大廠(騰訊,網(wǎng)易,百度)有沒有,也可以去看看。不知道有沒有其他的可以使用,知道的歡迎在評論區(qū)留言。
Sophix這個熱修復方案的還是不錯的,簡單接入快,非侵入式,管理方便。

簡單介紹下熱修復使用場景,可對線上App發(fā)現(xiàn)嚴重bug進行緊急修復,需要付出巨大的成本進行換包和重新發(fā)布。采用移動熱修復服務,可以隨時發(fā)布補丁實時解決線上問題,用戶全程無感知。
Sophix接入的流程如下:阿里云創(chuàng)建應用->接入SDK->生成補丁包->發(fā)布補丁->補丁測試
1.阿里云創(chuàng)建應用
阿里云官網(wǎng)
官網(wǎng)路徑:產(chǎn)品-移動研發(fā)平臺 EMAS-移動熱修復-創(chuàng)建應用


拿到應用appkey等標志信息

2.接入SDK
接入文檔
這里直接上官方接入文檔,我就不復制官網(wǎng)的接入代碼了,按照官網(wǎng)的接入說明一步一步往下走即可。
關于SophixStubApplication 踩坑
需要特別注意的是SophixStubApplication這個類的里面的方法使用,我在這里踩了坑,
我把代碼貼出來
package com.my.pkg;
import android.app.Application;
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
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;
import com.my.pkg.MyRealApplication;
/**
* Sophix入口類,專門用于初始化Sophix,不應包含任何業(yè)務邏輯。
* 此類必須繼承自SophixApplication,onCreate方法不需要實現(xiàn)。
* 此類不應與項目中的其他類有任何互相調(diào)用的邏輯,必須完全做到隔離。
* AndroidManifest中設置application為此類,而SophixEntry中設為原先Application類。
* 注意原先Application里不需要再重復初始化Sophix,并且需要避免混淆原先Application類。
* 如有其它自定義改造,請咨詢官方后妥善處理。
*/
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此處SophixEntry應指定真正的Application,并且保證RealApplicationStub類名不被混淆。
@Keep
@SophixEntry(MyRealApplication.class)
static class RealApplicationStub {}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex,需要在此處調(diào)用。
// MultiDex.install(this);
initSophix();
}
private void initSophix() {
String appVersion = "0.0.0";
try {
appVersion = BuildConfig.VERSION_NAME;
} 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保存狀態(tài)。
Log.i(TAG, "sophix preload patch success. restart app to make effect.");
}
}
}).initialize();
}
}
這里@SophixEntry(MyApplication.class)是引用之前的自己在用的Application,SophixStubApplication不能被任何類調(diào)用和調(diào)用除原生/官網(wǎng)寫的其他任何類,推薦直接使用官網(wǎng)的,只更改 @SophixEntry(XXX.class)即可,在AndroidManifest.xml文件中引用android:name=".SophixStubApplication",相當于新增了一個中間類SophixStubApplication;之前Application不用做修改。
在代碼混淆中記得把包路徑換成自己項目的正確包路徑。
其他注意點
1.推薦使用 BuildConfig.VERSION_NAME;獲取版本號
2.注意這句話 生成的mapping.txt在app/build/outputs/mapping/release路徑下,移動到/app路徑下,修復后的項目使用,保證混淆結果一致很關鍵。如果混淆文件不一致,將導致補丁下載成功但無法成功補丁成功。
#基線包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/build/outputs/mapping/release路徑下,移動到/app路徑下
#修復后的項目使用,保證混淆結果一致
-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize
-keepclassmembers class xxx.xxx.xxx.MyRealApplication {
public <init>();
}
-keep class xxx.xxx.xxx.SophixStubApplication$RealApplicationStub
3.生成補丁包
生成補丁包按照官網(wǎng)的說明下載生成補丁程序即可,官方也有對程序功能的說明;這里直接附上鏈接。跳轉(zhuǎn)到生成補丁官方文檔
生成補丁踩坑
官網(wǎng)說Key Store Password,Key Alias,Key Passwrod是選填可不填,但只要發(fā)布的包都是經(jīng)過簽名的,這里推薦必填,把簽名文件路徑引入,填寫簽名密碼。
現(xiàn)在也支持xxx.keystore后綴的簽名文件了,上面說不支持可能還沒改過來。


4.發(fā)布上傳補丁
發(fā)布補丁比較簡單,去控制臺發(fā)布就好了,我這里貼出發(fā)布補丁的官方操作說明
發(fā)布補丁官方操作說明鏈接

5.補丁測試
注:測試時請保證混淆文件不變