前言
Robust熱更新系統借鑑Instant Run原理,實現了一個兼容性更強而且實時生效的熱更新方案。其基本思路是,Robust熱更新系統在一個方法的入口處插入一段跳轉代碼,當發現某個方法出現bug就跳轉執行補丁中的代碼,略過原有代碼的執行,否則執行原有方法體邏輯。
Github:https://github.com/Meituan-Dianping/Robust/blob/master/README-zh.md
1.ROBUST 接入
接入流程 https://github.com/Meituan-Dianping/Robust/blob/master/README-zh.md
引入類庫
1.在App的build.gradle 目錄下引入依賴:
2.在整個工程的build.gradle目錄下加入:
Robust.xml數據配置
在項目的src同級目錄下配置部分配置robust.xml文件,按需求自行配置。
robust.xml https://123.sankuai.com/km/api/file/16297368/16310626
在未修復之前,先用打線上包的命令打包,保留build目錄下的mapping.txt和methodsMap.robust文件。
補丁路徑設置,此處設置補丁的加載位置,這樣才能知道,補丁下載到哪,又該去哪裏加載
繼承此類,實現上述3個抽象方法。(Tips:按demo自己copy,有特殊要求自行訂製。)
此處做一個思考,爲啥不用接口,要用抽象類。
2.補丁製作
自動化補丁製作:自動製作補丁 https://tech.meituan.com/android_autopatch.html
手動製作
3.加載補丁
4.線上修復流程
Jenkins一鍵補丁 https://wiki.sankuai.com/pages/viewpage.action?pageId=905191353
測試服補丁發佈地址
補丁的測試與發佈
上線之前先在測試服務器進行發佈,免得污染線上的環境。爲了把線上apk中的獲取補丁的請求轉發到測試服務器上,需要使用Charles進行轉發,需要導入配置文件。
原理: App啓動之初,會去請求一個補丁list,如果線上有補丁發佈,且符合補丁下發條件,則會去下載補丁,自動加載。
請求帶有如下主要參數:
appVersion : 添加補丁時填寫,基於哪個版本的apk開發的補丁。
apkHash:用來保證線上apk的唯一性。
uuid:補丁下發策略。
userId:補丁下發策略,用戶登陸後,根據userId決定向哪些用戶下發補丁。
下面是一個測試的請求補丁請求:
/appupdate/patch/list?apiLevel=22&dev=M1-NL&devModel=M1-NL&brand=SUNMI&jvmVersion=2.1.0&userId=27997173&channel=jenkins&cpuArc=armeabi-v7a&robustVersion=60000&apkHash=1b8581e3eb0c615af855a8086a281e56&applicationId=com.sankuai.erp.waiter&uuid=43e0b9dc7902464a8a34418f9a913a160000000000000271990&appVersion=2.1.0 HTTP/1.1
請求成功之後,會在download文件夾下面下載一個補丁,如圖:
5.優缺點對比