1. 程式人生 > >Sophix熱修復問題以及加固

Sophix熱修復問題以及加固

聽說這個可以兩行程式碼實現熱修復,瞬間按耐不住了,
正好公測階段,申請了一下許可權,等了將近一天吧,通過了認證。然後就是開開心心去嘗試了

以下是嘗試中遇到的問題:
額,,等會說吧,要不先說一下怎麼接入,雖然產品文件已經很透明瞭,但是還是說一下吧

  • 導包都會哈

  • 這裡我用的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 中,否則無網路許可權,建議放在後面任意時刻,如onCreateSophixManager.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 跳轉一下,啦啦啦 —成功

不用謝我,推薦一波個人網站,喜歡的話請收藏吧,
–! 臣跪謝