Sophix熱修復問題以及加固
阿新 • • 發佈:2019-01-28
聽說這個可以兩行程式碼實現熱修復,瞬間按耐不住了,
正好公測階段,申請了一下許可權,等了將近一天吧,通過了認證。然後就是開開心心去嘗試了
以下是嘗試中遇到的問題:
額,,等會說吧,要不先說一下怎麼接入,雖然產品文件已經很透明瞭,但是還是說一下吧
導包都會哈
這裡我用的Kotlin 編寫的,在Application 中實現需要新增的程式碼,也就是這兩行程式碼實現熱修復
// initialize最好放在attachBaseContext最前面
SophixManager.getInstance().setContext(this)
.setAppVersion(appVersion)
.setAesKey(null )
.setEnableDebug(true)
.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) {
// 表明新補丁生效需要重啟. 開發者可提示使用者或者強制重啟;
// 建議: 使用者可以監聽進入後臺事件, 然後應用自殺
} else if (code == PatchStatus.CODE_LOAD_FAIL) {
// 內部引擎異常, 推薦此時清空本地補丁, 防止失敗補丁重複載入
// SophixManager.getInstance().cleanPatches();
} else {
// 其它錯誤資訊, 檢視PatchStatus類說明
}
}
}).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網路許可權,建議放在後面任意時刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
然後就完了—zzz
像之前玩Tinker的時候可沒這麼簡單
好了接下來就是問題所在了
很簡單的問題,我弄了一上午,最後發現一句關鍵的話
1.4 版本管理說明
說明一:patch是針對客戶端具體某個版本的,patch和具體版本繫結
eg. 應用當前版本號是1.1.0, 那麼只能在後臺查詢到1.1.0版本對應釋出的補丁, 而查詢不到之前1.0.0舊版本釋出的補丁.
說明二:針對某個具體版本釋出的新補丁, 必須包含所有的bugfix, 而不能依賴補丁遞增修復的方式, 因為應用僅可能載入一個補丁
eg. 針對1.0.0版本在後臺釋出了一個補丁版本號為1的補丁修復了bug1, 然後發現此時針對這個版本補丁1修復的不完全, 程式碼還有bug2, 在後臺重新發佈一個補丁版本號為2的補丁, 那麼此時補丁2就必須同時包含bug1和bug2的修復才行, 而不是隻包含bug2的修復(bug1就沒被修復了)
我當時手賤改了一下
SophixManager.getInstance().setContext(this)
.setAppVersion(“1.0.1”)//注意下我寫的是1.0.1
實際中我測試的版本是1.0 –而且我在版本=控制檯寫的也是1.0,
這就尷尬了,輪詢器查詢不到1.0.1版本jar 檔案。
後來改了一下,瞬間世界觀崩塌,好傷心一下子好用了~~
問題二:加固
加固問題,Tinker 不支援加固,後來我就沒深入嘗試,但是Sophix 可以呀,但是不能拿加固完成的版本作為舊包,新包。
你需要的只是在加固之前生成差異包,不然會無法生成jar 檔案
問題三:四大元件
對於Sophix 不能建立四大元件的問題,我想了一下,我覺得我們可以嘗試一下在舊版本先佔幾個坑,作為空實現,我們起名 TextActivity1,記得在清單檔案中註冊一下
我們釋出後發現出問題了,腫麼辦,OK ,現在只需要在我們佔的坑TextActivity1中實現方法以及邏輯,最後通過intent 跳轉一下,啦啦啦 —成功
不用謝我,推薦一波個人網站,喜歡的話請收藏吧,
–! 臣跪謝