準備工作
- 打開阿裡雲
- 找到産品
- 找到移動熱修複
- 建立APP(在右上角)
- 然後會有app id 等資訊,配置會用到(複制的時候注意會有空格)
官方內建文檔
1、配置
- 添加maven倉庫位址:
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
- 添加gradle坐标版本依賴:
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'
- 添權重限
<! -- 網絡權限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<! -- 外部存儲讀權限,調試工具加載本地更新檔需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注意
READ_EXTERNAL_STORAGE
在6.0+需要動态擷取的哦~
- 在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密鑰" />
- Application中初始化
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
// initialize最好放在attachBaseContext最前面,初始化直接在Application類裡面,切勿封裝到其他類
SophixManager.getInstance().setContext(this)
.setAppVersion(getVersionName())
.setAesKey(null)
.setEnableDebug(true)//正式釋出該參數必須為false
.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) {
// 表明更新檔加載成功
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 表明新更新檔生效需要重新開機. 開發者可提示使用者或者強制重新開機;
// 建議: 使用者可以監聽進入背景事件, 然後調用killProcessSafely自殺,以此加快應用更新檔,詳見1.3.2.3
//SophixManager.getInstance().killProcessSafely();
} else {
// 其它錯誤資訊, 檢視PatchStatus類說明
}
}
}).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網絡權限,建議放在後面任意時刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
}
public String getVersionName() {
try {
return this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
以上配置無需動腦,直接從內建文檔中複制過來就ok的~
别忘了引用你的Application類
2、代碼
這一步就是模拟修複bug
- 就很簡單設定“第一次運作”

- 運作效果
- 這時候簽名打一個包,demo_1.apk,假裝這是一個出bug的apk
- 完成之後,修改代碼并變成紅色,假裝修複
- 運作效果
- 此時再打一個包,demo_2.apk
3、釋出
好了,到第三步了,也是比較關鍵的地方了,但是不要怕,依然沒有難度
大概原理:在第二步中我們打了兩個安裝包,demo_1.apk 和 demo_2.apk,就是比較這兩個apk,差異的部分生成更新檔包,然後控制台去控制下發、拉取、加載等操作。
- 是以,現在就需要用到更新檔包,需要這個工具SophixPatchTool,以windows為例,下載下傳之後解壓,找到并打開SophixPatchTool.exe,然後選擇舊包、新包
Android三步內建阿裡熱修複——Sophix - 設定裡面選擇更新檔包的輸出路徑
- 進階
Android三步內建阿裡熱修複——Sophix - 點選 GO 開始生成更新檔包
這裡可能會遇到 apk加強
而無法生成更新檔包的情況,加強前先生成更新檔,然後再加強,加強了的apk是可以應用上更新檔的。
- 打開輸出路徑
Android三步內建阿裡熱修複——Sophix
可以看到多了一個sophix-patch.jar檔案
- 控制台先添加版本,比如1.0.0
- 然後檢視詳情中,選擇上傳更新檔,就是剛才的jar檔案
- 上傳之後就可以釋出了
Android三步內建阿裡熱修複——Sophix
比如現在手機裝的是demo_1.apk,釋出之後就可以重新打開,再運作就是demo_2.apk的效果了
為什麼需要重新打開呢
在生成更新檔包的時候,有一個進階選項,我沒有勾選強制冷啟動,Sophix就會根據情況自己去選擇冷啟動生效還是及時生效。
哦對了,還有個測試,調試更新檔
也超簡單的,下載下傳調試工具,是個apk,打開如下圖
操作:
- 第一個是輸入包名,然後點選連接配接,連接配接成功的話會在下面通知内容中顯示success
- 然後掃描二維碼,就是釋出時那個二維碼
- 然後就是輸入絕對路徑了,就是更新檔包在手機的路徑
- 然後點選應用就ok了,通知中會顯示-1,表示本地更新檔,2 表示本地更新檔模式, 1 表示加載成功
總結
整套操作下來基本沒有難度,不過要用好的話還是需要把官方文檔好好研究一下,比如能不能直接加一個Activity啊、更新檔包發錯了怎麼辦啊、更新檔怎麼找不到啊等等,其實都有對應的解決方案,實在解決不了也可以送出一個工單,我這個內建下來十分鐘左右就搞定了,當然,官方文檔我也研究了好幾遍。。