initialize方法
initialize(): <必選>
該方法主要做些必要的初始化工作以及如果本地有補丁的話會加載補丁,但不會自動請求補丁。因此需要自行調用queryAndLoadNewPatch方法拉取補丁。initialize調用需要盡可能的早,必須在Application的attachBaseContext方法的最前面調用(在super.attachBaseContext之后,如果有Multidex,也需要在Multidex.install之后),initialize()方法調用之前你需要先調用如下幾個方法進行一些必要的參數設置,方法調用說明如下:
setContext(application): <必選>
傳入入口Application即可
setAppVersion(appVersion): <必選>
應用的版本號,拉取補丁時對應控制臺創建的版本。
舉例:
setAppVersion傳1.0.0,控制臺創建1.0.0的版本號然后發布補丁,這樣拉取對應版本號下的補丁。
setAppVersion傳1.0.0加載了對應的補丁,升級安裝新的apk后傳1.0.1,會自動清理1.0.0的補丁。
setSecretMetaData(idSecret, appSecret, rsaSecret): <可選,推薦使用>
三個Secret分別對應AndroidManifest里面的三個參數,可以不在AndroidManifest設置而是用此函數來設置Secret。放到代碼里面進行設置可以自定義混淆代碼,更加安全,此函數的設置會覆蓋AndroidManifest里面的設置,如果對應的值設為null,默認會在使用AndroidManifest里面的。
setEnableDebug(isEnabled): <可選>
isEnabled默認為false,是否打開調試模式,調試模式下會輸出日志以及不進行補丁簽名校驗。線下調試此參數可以設置為true,查看日志過濾TAG:Sophix,同時強制不對補丁進行簽名校驗,所以就算補丁未簽名或者簽名失敗也發現可以加載成功。
正式發布該參數必須為false,false會對補丁做簽名校驗,否則就可能存在安全漏洞風險。
setAesKey(aesKey): <可選>
用戶自定義aes密鑰,會對補丁包采用對稱加密。這個參數值必須是16位數字或字母的組合,是和補丁工具設置里面AES Key保持完全一致,補丁才能正確被解密進而加載。此時平臺無感知這個密鑰,所以不用擔心阿里云移動平臺會利用你們的補丁做一些非法的事情。
setPatchLoadStatusStub(new PatchLoadStatusListener()): <可選>
設置patch加載狀態監聽器,該方法參數需要實現PatchLoadStatusListener接口,接口說明見下文PatchLoadStatusListener說明。
setUnsupportedModel(modelName, sdkVersionInt): <可選>
把不支持的設備加入黑名單,加入后不會進行熱修復。
modelName為該機型上Build.MODEL的值,這個值也可以通過
adb shell getprop | grep ro.product.model
取得。sdkVersionInt就是該機型的Android版本,也就是Build.VERSION.SDK_INT,若設為0,則對應該機型所有安卓版本。
目前控制臺也可以直接設置機型黑名單,更加靈活。詳情請參見過濾機型。
queryAndLoadNewPatch方法
該方法主要用于查詢服務器是否有新的可用補丁。SDK內部限制連續兩次queryAndLoadNewPatch()方法調用不能短于3s,否則的話就會報code:19的錯誤碼。 如果查詢到可用的話,首先下載補丁到本地,然后:
補丁工具在打包時可選擇是否強制冷啟動。如果不勾選強制冷啟動,工具會根據代碼變動自動判斷生成冷啟動或熱補丁。
熱補丁并非一律需要重啟應用才能生效,具體需根據實際情況和補丁類型來定。如果當前應用的補丁是冷補丁,那么需要重啟生效。
應用已經存在一個補丁,請求發現有新補丁后,本次不受影響。并且在下次啟動時補丁文件刪除,下載并預加載新補丁,在下次啟動時應用新補丁。
補丁在后臺發布之后,并不會主動下行推送到客戶端,需要手動調用queryAndLoadNewPatch方法查詢后臺補丁是否可用。
只會下載補丁版本號比當前應用存在的補丁版本號高的補丁,比如當前應用已經下載了補丁版本號為5的補丁,那么只有后臺發布的補丁版本號>5才會重新下載。
移動熱修復控制臺上線了“全部回滾”補丁的功能,如果后臺進行了“全部回滾”的操作,那么這個方法將會返回code:18的狀態碼。 此時本地補丁將會被強制清除,同時不清除本地補丁版本號。
killProcessSafely方法
可以在PatchLoadStatusListener監聽到CODE_LOAD_RELAUNCH后在合適的時機,調用此方法殺死進程。
不可以直接Process.killProcess(Process.myPid())來殺進程,這樣會擾亂Sophix的內部狀態。因此如果需要殺死進程,建議使用killProcessSafely方法,它在內部做一些適當處理后才殺死本進程。
cleanPatches()方法
清空本地補丁,并且不再拉取被清空的版本的補丁。正常情況下不需要開發者自己調用,因為Sophix內部會判斷對補丁引發崩潰的情況進行自動清空。
PatchLoadStatusListener接口
該接口需要自行實現并傳入initialize
方法中,補丁加載狀態會回調給該接口,參數說明如下:
mode:無實際意義,為了兼容老版本,默認始終為0
code:補丁加載狀態碼,詳情查看PatchStatus類說明
info:補丁加載詳細說明
handlePatchVersion:當前處理的補丁版本號,0:無;-1:本地補丁;其它:后臺補丁
setTags接口 [v3.2.7新增]
該參數設置端上拉取補丁包時的標簽,可以支持條件更為豐富的灰度發布,以下為簡單示例:
List<String> tags = new ArrayList<>();
tags.add("test");
//此處調用在queryAndLoadNewPatch()方法前
SophixManager.getInstance().setTags(tags);
List<String> tags = new ArrayList<>();
tags.add("production");
//此處調用在queryAndLoadNewPatch()方法前
SophixManager.getInstance().setTags(tags);
如上,設置不同的tags,同一版本號下,可以打兩個或者多個基線包,線上發布時用production的基線包,測試環境用test的基線包,這樣就可以測試同一版本號下的同一個補丁了,兩個環境互不影響。tags可以add多個,結構為前后非空字符串即可。生成補丁時,用同樣tags的基線包和修復包。