Android 熱修復

Scus發表於2018-12-26

什麼是熱修復技術? AndFix 框架替換原理和優勢...

什麼是熱修復技術?

當我們已上線的app出現了非常影響使用者使用的緊急Bug,通常情況下需要在第一時間線下修復該bug,然後經過一系列測試驗證,最後打渠道包在各大應用市場重新發布升級版本,使用者通過下載新包完成Bug修復;

顯然,整個過程很耗時耗力,一定程度上也會影響到使用者使用體驗,鑑於這種問題存在,熱修復框架就產生了。
開發人員只需要針對Bug打出補丁推給使用者,使用者檢測到補丁然後自動拉取,修復Bug;

對於Bug的處理,我們不要過於依賴熱修復框架,在開發的過程中還是要按照標準的流程做好自測、配合測試人員完成測試流程 。

AndFix原理和優勢

  • AndFix,全稱是Android hot-fix。是阿里開源的一個Android熱補丁框架,允許APP在不重新發布版本的情況下修復線上的bug。

  • AndFix的原理就是方法的替換,把有bug的方法替換成補丁檔案中的方法

AndFix原理描述

Andfix在專案中使用過程介紹

1. 補丁包生成

1. 正常編譯打包生成apk檔案(帶Bug的),例如:old.apk;

2. 修復Bug後打包生成新的apk檔案 例如: new.apk  ;

3. 利用工程中tools資料夾下apkpatch工具生成 .aptch補丁檔案;
複製程式碼
 (a). cd 進入tools資料夾下複製程式碼
 (b). 執行 apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>複製程式碼
-o <output> : 輸出目錄
-k <keystore>: 打包所用的keystore
-p <password>: keystore的密碼
-a <alias>: keystore 使用者別名
-e <alias password>: keystore 使用者別名密碼
-f <new.apk> :新版本
-t <old.apk> : 舊版本
複製程式碼

2. 補丁檔案上傳

將生成的.apkpatch檔案 手動上傳到服務端(詳細操作暫無)

3. 下載補丁檔案

1. 檢測補丁包介面 ;
複製程式碼

在程式初始化時請求介面,檢測服務端補丁資訊

 無補丁:繼續初始化框架 <div class="md-section-divider"></div>複製程式碼
 有補丁:執行如下2操作 複製程式碼
2. 補丁包下載介面 ;
複製程式碼

下載補丁檔案

 拉取失敗:下次程式進入重新校驗補丁包,並下載  複製程式碼
 拉取成功: 執行如下3操作 複製程式碼
3. 解壓縮 ;
複製程式碼
 1.對壓縮包進行解壓    複製程式碼
 2.校驗合法性(檔案型別,長度,驗證補丁檔案的簽名,驗證優化檔案的指紋等)複製程式碼
4. 解密 ;
複製程式碼
 解密壓縮包 複製程式碼
 新增補丁 patchManager . addPatch(路徑)複製程式碼

4. 重啟程式,載入補丁,修復bug

 patchManager . loadPatch()複製程式碼

補丁載入通常是在應用程式的初始化階段(例如Application.onCreate());

補丁內部替換流程說明:

補丁內部替換流程說明

1.補丁下載到相應目錄

2.通過loadPatch方法載入

3.會將補丁複製到app的目錄裡面,然後下載補丁的檔案會被刪除

4.如果versionName改變了,將會刪除apatch裡面所有的補丁。
複製程式碼

5. 混淆處理

-printmapping proguard.map 首先需要生成mapping檔案記錄混淆規則,之後可以把printmapping 這句話註釋掉,每次只使用applymapping。

 -applymapping proguard.map (然後在下面加上) 複製程式碼
 -keepclass*extendsjava.lang.annotation.Annotation 複製程式碼
 -keepclasseswithmembernamesclass*{native ;} 複製程式碼
 -keepclasscom.alipay.euler.andfix.**{ *; } 複製程式碼

6. 侷限性

  1. 無法新增新類和新欄位

  2. 無法替換建構函式和Application的onCreate方法

  3. 無法動態加入新功能模組,有別於dex的替換


相關文章