上周看到一篇關于阿裡公測的熱修複Sophix的文章——阿裡推出業界首個非侵入式熱修複方案Sophix,颠覆移動端傳統發版更新流程!
文章中有一張關于Sophix、Tinker、Amigo的對比圖檔,之前使用Tinker感覺也還可以,但既然Sophix說更好,那就當然要嘗試下了,而且Tinker不能修複加強的APK還是有點不足的,但驚喜的是Sophix貌似可以修複加強的APK。
簡單使用
Sophix的使用就像圖上說的那樣,真正的傻瓜式接入。
1、建立項目
控制台建立應用(https://help.aliyun.com/document_detail/53238.html)
本地建立Android項目
2、添加配置
android studio內建方式
maven倉庫
allprojects {
repositories {
jcenter()
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
}
}
}
gradle依賴
compile('com.aliyun.ams:alicloud-android-hotfix:3.0.2') {
exclude(module: 'alicloud-android-utdid')
}
3、設定AndroidManifest
權限
<!-- 網絡權限 -->
<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" />
application節點(value中的值分别改為通過平台HotFix服務申請得到的App Secret和RSA密鑰)
<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密鑰" />
混淆檔案
#基線包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路徑下,移動到/app路徑下
#修複後的項目使用,保證混淆結果一緻
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize
4、使用
SDK初始化
private void initSophix() {
SophixManager.getInstance().setContext(this)
.setAppVersion(BuildConfig.VERSION_NAME)
//如果這裡設定了AES,在生成熱修複包的時候也需要配置
.setAesKey("1234567890123456")
.setEnableDebug(true)
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
// 更新檔加載回調通知
Log.i(TAG, String.format("mode=%d,code=%d,info=%s,handlePatchVersion=%d", mode, code, info, handlePatchVersion));
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
// 表明更新檔加載成功
Log.i(TAG, "表明更新檔加載成功");
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 表明新更新檔生效需要重新開機. 開發者可提示使用者或者強制重新開機;
// 建議: 使用者可以監聽進入背景事件, 然後應用自殺
Log.i(TAG, "表明新更新檔生效需要重新開機");
} else if (code == PatchStatus.CODE_LOAD_FAIL) {
// 内部引擎異常, 推薦此時清空本地更新檔, 防止失敗更新檔重複加載
SophixManager.getInstance().cleanPatches();
Log.i(TAG, "内部引擎異常");
} else {
// 其它錯誤資訊, 檢視PatchStatus類說明
Log.i(TAG, "其它錯誤資訊");
}
}
}).initialize();
}
最簡單的使用已經完成,詳情可檢視 快速接入。
更新檔生成
1、日志(小坑)
如果你裝的Java JDK是1.8可能出現這個錯誤資訊,隻需要删除C:\Windows\System32和C:\Windows\SysWOW64下的java*.exe
2、設定
3、進階設定(根據個人需求)
4、傻瓜式使用(點選Go!生成)
更新檔工具使用說明
調試工具
開發中總是需要調試,Sophix也提供了更新檔的調試,不需要釋出直接可以測試更新檔的使用。
調試工具使用
注:在調試過程中發現Sophix可以在360加強的APK中使用,不過需要注意的是這時候去生成更新檔需要使用未加強的APK,否則雖然也能生成APK,但使用的時候隻能修複class類,其他so庫、資源檔案等都無法修複,這應該是Sophix隻進行了類加載方案。
資料
文檔
https://help.aliyun.com/document_detail/51415.html
github
https://github.com/aliyun/alicloud-android-demo/tree/master/hotfix_android_demo
源碼Demo
執行個體