Android 美團Robust熱更新 使用入門

轉載請注明出處:http://blog.csdn.net/snailbaby_soko/article/details/69524380

*本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家發(fā)布

<h1>Android熱更新方案Robust</h1>


相信很多人都認識了解過 熱修復餐胀、熱更新漾月、熱補丁(對于這個技術也沒有特別標準的一種叫法,下面我統(tǒng)一叫熱更新)瘸右,之后的一年里,各種熱更新方案如雨后春筍般出現(xiàn)奢赂,比較耳熟能詳?shù)木陀蠳uwa邑闲、Tinker、Andfix 和 Dexposed 等等刨仑,他們之間的區(qū)別以及優(yōu)缺點就不在這里討論了郑诺,鑒于它們的實際使用和局限性夹姥,美團的開發(fā)團隊就腦洞大開了杉武。

就去年 Google 高調發(fā)布了 Android Studio 2.0,其中最重要的新特性Instant Run辙售,實現(xiàn)了對代碼修改的實時生效(熱插拔)轻抱。美團開發(fā)團隊在了解 Instant Run 原理之后,實現(xiàn)了一個兼容性更強的熱更新方案旦部,這就是產(chǎn)品化的hotpatch框架-----Robust

對于 Robust 的原理我們后面的文章再討論祈搜,本篇只針對想快速上手的入門講解,想先了解 Robust 的原理以及技術核心的同學請移步到

Android熱更新方案Robust

Android熱更新方案Robust開源士八,新增自動化補丁工具

美團 Robust 的 github demo 地址


<h3>使用場景</h3>

先介紹一下 Robust 的適用場景容燕,與以往大家認識的熱更新一樣婚度,對線上事故很難有即時生效的解決方式蘸秘,每次發(fā)版都如臨深淵如履薄冰,畢竟就算再完善的開發(fā)測試流程也無法保證不會將 Bug 帶到線上蝗茁,特別是新 app 剛上線醋虏,一個bug不只是影響到幾個幾十個用戶,一些創(chuàng)業(yè)性app的崩潰或者bug可能直接導致用戶卸載和永不使用哮翘。對于這種致命的又無可奈何的問題颈嚼,Robust 就是時候該站出來摸摸你的頭,輕聲而又自信的說“別怕饭寺,你還有我”阻课。

<h3>大概流程</h3>

1.集成了 Robust 后叫挟,生成 apk。保存期間的混淆文件 mapping.txt柑肴,以及 Robust 生成記錄文件 methodMap.robust
2.使用注解 @Modify 或者方法 RobustModify.modify() 標注需要修復的方法
3.開啟補丁插件霞揉,執(zhí)行生成 apk 命令,獲得補丁包 patch.jar
4.通過推送或者接口的形式晰骑,通知 app 有補丁适秩,需要修復
5.加載補丁文件不需要重新啟動應用

<h3>動手</h3>

首先遠程依賴 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,該文件在打補丁的時候用來區(qū)別到底哪些方法需要被修復扮饶,所以有它才能打補丁具练。而上文所說的還有 mapping.txt 文件,該文件列出了原始的類甜无,方法和字段名與混淆后代碼間的映射扛点。這個文件很重要,可以用它來翻譯被混淆的代碼毫蚓。但也不是必須的占键,如果不需要混淆,可以不保留元潘。這兩個文件在生成apk后畔乙,分別在
build/outputs/robust/methodsMap.robust,build/outputs/mapping/mapping.txt(需要開啟混淆后才會出現(xiàn))翩概,我們需要自己分別拷貝到 app/robust 下牲距,在 app 目錄新建個叫 robust 的文件夾返咱,把這兩個文件放進去就 ok 了。

此時牍鞠,完成了第二步了咖摹。我們得到了 apk ,mapping.txt难述,methodMap.robust 萤晴,有了它們我們再繼續(xù)生成補丁 patch.jar。然而我踩到過的坑是胁后,沒有簽名文件一樣可以完成上述步驟店读,但在安裝apk的時候會被告知該 apk 已損壞,所以按普通簽名那樣加上簽名文件就行了攀芯。

<h3>制作補丁并使用</h3>

我們新建的工程很簡單屯断,只有2個button,一個用來加載補丁侣诺,一個用來跳轉殖演。如圖,首頁和沒加載補丁時跳轉的頁面年鸳。剛才我們說趴久,要怎么使用補丁文件,看下面加載補丁的按鈕事件里面阻星,看到了沒朋鞍,就那么一句話就能實現(xiàn)加載補丁了已添。

沒加載補丁跳轉頁

new PatchExecutor(上下文我懂妥箕,xxx,callback我也懂).start()

中間的xxx是個什么東西啊更舞,還需要自己寫畦幢?帶著這個疑問去思考一下,就不難發(fā)現(xiàn)缆蝉,要加載補丁肯定得知道 patch.jar 放在哪啊是吧宇葱,打開看一眼(不要害怕只有很少代碼),為了方便展示刊头,就把不太重要的三個方法縮起來了黍瞧,copy 方法是普通文件拷貝的IO流,verifyPatch 方法本來是驗證補丁有效性的原杂,后來發(fā)現(xiàn)對普通使用者沒有那么高要求印颤,就改成了備份補丁的回調了,ensurePatchExist 方法就檢測補丁存在與否穿肄,好了大概知道其它的方法就詳細介紹下主要方法 fetchPatchList年局,回顧一下上面的xxx再聯(lián)想到這里吧际看,既然我們要加載補丁,那么我們得知道補丁在哪啊矢否,這個方法就是把補丁找出來給上面那個誰用的仲闽。所以說,補丁的位置你可以根據(jù)拉取下來保存的位置來找出來僵朗,把路徑給 setLocalPath 就好赖欣。再有就 setPatchesInfoImplClassFullName 的包名需要和 robust.xml 配置的一樣

我們所需要做的跳轉后效果是修改一下textview顯示內容而已,那么在被修改的頁面需要怎么標注被修改的方法呢验庙,就像這樣畏鼓,先科普一下,在 robust 的注意事項里面已經(jīng)提到過壶谒,修改方法和字段會有一些局限性云矫,那是因為 android 本身ProGuard的內聯(lián)、優(yōu)化導致的汗菜。所以要繞過這個本身的問題让禀,要必須遵循一些規(guī)律了...以后再介紹這個。修改完這些陨界,我們再去 build.gradle 修改一下巡揍,開啟打補丁那個,關閉生成apk那個菌瘪。之后再在終端執(zhí)行一遍生成apk的命令行腮敌。直到終端那里出現(xiàn) auto patch end successfully(最后 build failed 是正常的,別緊張孩子)俏扩。再然后就是要把patch.jar push 到手機目錄路徑下啦糜工。那些自己推送下載的請自行調試更正,確保路徑正確录淡。還有記得給應用讀寫內存卡的權限

既然到了這里何缓,我們好像所有條件都具備了啊津肛,那么就點 LOAD PATCH 按鈕看看發(fā)生什么事吧厌均,如果看到 apply result true 那么就大功告成了维贺。

最后來個效果圖

謝謝美團開發(fā)團隊的開源和貢獻,還要特別感謝Robust作者之一的張夢同學彬檀,為 Robust 挖下的坑(開玩笑哈哈哈)帆啃,我們努力排坑只希望能讓大家更簡便的使用,以后的路還很長...大家有什么建議或意見窍帝,請到 github 上面去留言努潘。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慈俯,更是在濱河造成了極大的恐慌渤刃,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴膘,死亡現(xiàn)場離奇詭異卖子,居然都是意外死亡,警方通過查閱死者的電腦和手機刑峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門洋闽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人突梦,你說我怎么就攤上這事诫舅。” “怎么了宫患?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵刊懈,是天一觀的道長。 經(jīng)常有香客問我娃闲,道長虚汛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任皇帮,我火速辦了婚禮卷哩,結果婚禮上,老公的妹妹穿的比我還像新娘属拾。我一直安慰自己将谊,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布渐白。 她就那樣靜靜地躺著尊浓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礼预。 梳的紋絲不亂的頭發(fā)上眠砾,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天虏劲,我揣著相機與錄音托酸,去河邊找鬼。 笑死柒巫,一個胖子當著我的面吹牛励堡,可吹牛的內容都是我干的。 我是一名探鬼主播堡掏,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼应结,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起鹅龄,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揩慕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扮休,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迎卤,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年玷坠,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜗搔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡八堡,死狀恐怖樟凄,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情兄渺,我是刑警寧澤缝龄,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挂谍,受9級特大地震影響二拐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜凳兵,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一百新、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庐扫,春花似錦饭望、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萨醒,卻和暖如春斟珊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背富纸。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工囤踩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晓褪。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓堵漱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涣仿。 傳聞我的和親對象是個殘疾皇子勤庐,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容