Android 美团Robust热更新 使用入门
Android熱更新方案Robust
?
相信很多人都認識了解過 熱修復、熱更新、熱補丁(對于這個技術也沒有特別標準的一種叫法,下面我統一叫熱更新),之后的一年里,各種熱更新方案如雨后春筍般出現,比較耳熟能詳的就有Nuwa、Tinker、Andfix 和 Dexposed 等等,他們之間的區別以及優缺點就不在這里討論了,鑒于它們的實際使用和局限性,美團的開發團隊就腦洞大開了。
就去年 Google 高調發布了 Android Studio 2.0,其中最重要的新特性Instant Run,實現了對代碼修改的實時生效(熱插拔)。美團開發團隊在了解 Instant Run 原理之后,實現了一個兼容性更強的熱更新方案,這就是產品化的hotpatch框架—–Robust
對于 Robust 的原理我們后面的文章再討論,本篇只針對想快速上手的入門講解,想先了解 Robust 的原理以及技術核心的同學請移步到
Android熱更新方案Robust
Android熱更新方案Robust開源,新增自動化補丁工具
美團 Robust 的 github demo 地址
?
使用場景
?
先介紹一下 Robust 的適用場景,與以往大家認識的熱更新一樣,對線上事故很難有即時生效的解決方式,每次發版都如臨深淵如履薄冰,畢竟就算再完善的開發測試流程也無法保證不會將 Bug 帶到線上,特別是新 app 剛上線,一個bug不只是影響到幾個幾十個用戶,一些創業性app的崩潰或者bug可能直接導致用戶卸載和永不使用。對于這種致命的又無可奈何的問題,Robust 就是時候該站出來摸摸你的頭,輕聲而又自信的說“別怕,你還有我”。
?
大概流程
?
1.集成了 Robust 后,生成 apk。保存期間的混淆文件 mapping.txt,以及 Robust 生成記錄文件 methodMap.robust?
2.使用注解 @Modify 或者方法 RobustModify.modify() 標注需要修復的方法?
3.開啟補丁插件,執行生成 apk 命令,獲得補丁包 patch.jar?
4.通過推送或者接口的形式,通知 app 有補丁,需要修復?
5.加載補丁文件不需要重新啟動應用
?
動手
?
首先遠程依賴 Robust 的一些插件,用于輔助生成 patch.jar 的。此時我們不需要深入了解,只需要知道它是用來輔助的就好。在項目最外層的 build.gradle 添加兩處插件
classpath ‘com.meituan.robust:gradle-plugin:0.3.3’?
classpath ‘com.meituan.robust:auto-patch-plugin:0.3.3’
然后在項目的 build.gradle 添加
//apply plugin: ‘auto-patch-plugin’?
apply plugin: ‘robust’
compile ‘com.meituan.robust:robust:0.3.3’
此時,還沒完成第一步呢,別急,需要手動 copy 一份 robust.xml 的配置文件到app的目錄下,該文件各個配置注釋的很清楚,若沒特殊要求,不需要修改?
好了,準備工作完成。有了這些東西,待我們需要修復的時候就可以一鍵生成補丁 patch.jar 了。但別急,你還不知道怎么加載補丁呢…
先解釋一下,如上圖標注所說了,在生成 apk 的時候使用 apply plugin:’robust’,該插件會生成打補丁時需要的方法記錄文件 methodMap.robust,該文件在打補丁的時候用來區別到底哪些方法需要被修復,所以有它才能打補丁。而上文所說的還有 mapping.txt 文件,該文件列出了原始的類,方法和字段名與混淆后代碼間的映射。這個文件很重要,可以用它來翻譯被混淆的代碼。但也不是必須的,如果不需要混淆,可以不保留。這兩個文件在生成apk后,分別在?
build/outputs/robust/methodsMap.robust,build/outputs/mapping/mapping.txt(需要開啟混淆后才會出現),我們需要自己分別拷貝到 app/robust 下,在 app 目錄新建個叫 robust 的文件夾,把這兩個文件放進去就 ok 了。
此時,完成了第二步了。我們得到了 apk ,mapping.txt,methodMap.robust ,有了它們我們再繼續生成補丁 patch.jar。然而我踩到過的坑是,沒有簽名文件一樣可以完成上述步驟,但在安裝apk的時候會被告知該 apk 已損壞,所以按普通簽名那樣加上簽名文件就行了。
?
制作補丁并使用
?
我們新建的工程很簡單,只有2個button,一個用來加載補丁,一個用來跳轉。如圖,首頁和沒加載補丁時跳轉的頁面。剛才我們說,要怎么使用補丁文件,看下面加載補丁的按鈕事件里面,看到了沒,就那么一句話就能實現加載補丁了。
?
new PatchExecutor(上下文我懂,xxx,callback我也懂).start()
中間的xxx是個什么東西啊,還需要自己寫?帶著這個疑問去思考一下,就不難發現,要加載補丁肯定得知道 patch.jar 放在哪啊是吧,打開看一眼(不要害怕只有很少代碼),為了方便展示,就把不太重要的三個方法縮起來了,copy 方法是普通文件拷貝的IO流,verifyPatch 方法本來是驗證補丁有效性的,后來發現對普通使用者沒有那么高要求,就改成了備份補丁的回調了,ensurePatchExist 方法就檢測補丁存在與否,好了大概知道其它的方法就詳細介紹下主要方法 fetchPatchList,回顧一下上面的xxx再聯想到這里吧,既然我們要加載補丁,那么我們得知道補丁在哪啊,這個方法就是把補丁找出來給上面那個誰用的。所以說,補丁的位置你可以根據拉取下來保存的位置來找出來,把路徑給 setLocalPath 就好。再有就 setPatchesInfoImplClassFullName 的包名需要和 robust.xml 配置的一樣
我們所需要做的跳轉后效果是修改一下textview顯示內容而已,那么在被修改的頁面需要怎么標注被修改的方法呢,就像這樣,先科普一下,在 robust 的注意事項里面已經提到過,修改方法和字段會有一些局限性,那是因為 android 本身ProGuard的內聯、優化導致的。所以要繞過這個本身的問題,要必須遵循一些規律了…以后再介紹這個。修改完這些,我們再去 build.gradle 修改一下,開啟打補丁那個,關閉生成apk那個。之后再在終端執行一遍生成apk的命令行。直到終端那里出現 auto patch end successfully(最后 build failed 是正常的,別緊張孩子)。再然后就是要把patch.jar push 到手機目錄路徑下啦。那些自己推送下載的請自行調試更正,確保路徑正確。還有記得給應用讀寫內存卡的權限
既然到了這里,我們好像所有條件都具備了啊,那么就點 LOAD PATCH 按鈕看看發生什么事吧,如果看到 apply result true 那么就大功告成了。
最后來個效果圖
謝謝美團開發團隊的開源和貢獻,還要特別感謝Robust作者之一的張夢同學,為 Robust 挖下的坑(開玩笑哈哈哈),我們努力排坑只希望能讓大家更簡便的使用,以后的路還很長…大家有什么建議或意見,請到 github 上面去留言。
轉載于:https://www.cnblogs.com/chenxibobo/p/9651793.html
總結
以上是生活随笔為你收集整理的Android 美团Robust热更新 使用入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 配置JAVA_HOME
- 下一篇: Android OpenGL ES抗锯齿