Android最佳實踐(八)之熱修復方案

最近一年,熱修復在Android界很火,相信你們也或多或少的看過某些團隊的熱修復博文,關於框架選擇等等。框架選擇很重要,但作好對應的一整套熱修復方案,再去變動框架,則來的容易許多。前端

Andfix

andfix是阿里出的解決線上修復bugs的解決方案,那麼今天咱們先研究下andfix,以及如何將其運用到項目。
其聲稱AndFix支持Android 2.3到7.0,不管是ARM或X86架構,一樣也支持Dalvik和ART虛擬機,仍是32位和64位機型,通通都支持。後端

andfix的實現原理,以下:服務器

方法替換,Andfix經過自定義的註解來實現方法的替換,由於在ART內部有一個原生方法art_replaceMethod或在Dalvik中有一個dalvik_replaceMethod方法。架構

如何使用

使用起來很簡單:app

  1. 導入aar包:compile 'com.alipay.euler:andfix:0.5.0@aar'。框架

  2. 在自有application中初始化PatchManager。工具

  3. 加載過往補丁文件。學習

  4. 添加新補丁文件。測試

dependencies {
    compile 'com.alipay.euler:andfix:0.5.0@aar'
}

PatchManager patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
patchManager.loadPatch();
patchManager.addPatch(path);//path of the patch file that was downloaded

原理介紹

apkpatch將兩個apk作一次對比,而後找出不一樣的部分。能夠看到生成的apatch了文件,後綴改爲zip再解壓開,裏面有一個dex文件。經過jadx查看一下源碼,裏面就是被修復的代碼所在的類文件,這些更改過的類都加上了一個_CF的後綴,而且變更的方法都被加上了一個叫@MethodReplace的annotation,經過clazz和method指定了須要替換的方法。code

而後客戶端sdk獲得補丁文件後就會根據annotation來尋找須要替換的方法。最後由JNI層完成方法的替換。

若是本地保存了多個補丁,那麼AndFix會按照補丁生成的時間順序加載補丁。具體是根據.apatch文件中的PATCH.MF的字段Created-Time。

補丁方案

andfix上有不少issue,因此若是針對企業,貿然使用該熱修復,會致使大量問題。那麼針對補丁的一整套方案,纔是熱修復的關鍵。例如,如何進行灰度測試,如何控制黑白名單,如何進行補丁版本管理,如何自動化打補丁,如何進行補丁回退。

灰度測試

推動補丁方案,須要進行灰度測試,那麼使用白名單機制是必要的。何爲灰度測試,即針對某些特定人羣,發佈特定補丁,進行階段性測試。該特定人羣,能夠是公司範圍內的職員,能夠是公司深度用戶等。而如何保證補丁下發特定人羣,則須要相關的代碼控制。例如在應用開啓時,上傳該用戶的手機相關信息或對應的app版本號,後端經過這些信息判斷是否在白名單內,而後檢查補丁庫中是否有對應補丁。

補丁版本管理

補丁文件跟隨app的版本號,因此推薦使用四段式,如3.1.0.1,代表是對應的app版本是3.1.0。相應的,也須要有補丁發佈平臺,經過該平臺上傳補丁,前端提交版本信息,後端分析是否有對應補丁。同時也應該注意,增長補丁控制開關,在緊急狀況下,能夠利用該開關,來阻斷補丁的發佈。

自動化打補丁

在學習使用andfix中,會使用到apatch工具,而手動打補丁會出現一些問題。相信大部分公司都會利用jenkins構建項目,而對應的簽名文件,則放置在服務器。例如當構建一次成功後,會將對應的apk改名,而後發佈到公司官網等渠道,保存該apk,若該版本出現問題,修復代碼,再次構建,保存該apk,利用該apk和原始的apk進行diff,生成補丁文件,推送至補丁發佈平臺。這樣,一整套流程就清晰了,而後開發人員只須要在預發佈環境中,驗證補丁是否可正常運行,如能正常運行,就可直接打開補丁發佈開關,進行用戶推送了。

補丁閃退

當某用戶下載完補丁後,因爲某些緣由,好比國產rom,最新Android版本等,致使其在初始化補丁時,應用就崩潰,也有多是由於補丁發佈失誤等狀況。針對這些狀況,若是沒有有效的處理手段,那麼就會損失掉這部分用戶。如何進行補丁回退,是補丁方案中重要的一環。而解決方案也多種多樣,例如,當在執行熱修復代碼以前,判斷補丁崩潰標記是否存在,若不存在,設置一個標記位,而後在執行熱修復代碼完畢後,再清除該標記,若存在,則跳過熱修復代碼。

那麼如何管理該標記,若是用戶在使用某次補丁時,異常崩潰後,若是不對該標記進行管理,即其會致使該用戶沒法使用補丁文件,解決方案也有不少,例如標記跟隨版本號等。

固然針對補丁閃退,還可有其餘的回退方案,例如檢測到該用戶補丁閃退,即進行清除用戶補丁文件等必要操做。

相關文章
相關標籤/搜索