Robust接入簡單說明

準(zhǔn)備


  1. 在APP的build.gradle文件中,添加依賴:

    apply plugin: 'com.android.application'
    //制作補(bǔ)丁時將這個打開,auto-patch-plugin緊跟著com.android.application
    //apply plugin: 'auto-patch-plugin'
    apply plugin: 'robust'
     
     
    compile 'com.meituan.robust:robust:0.4.99'
    
  2. 在整個項目的build.gradle中加入

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
             classpath 'com.meituan.robust:gradle-plugin:0.4.99'
             classpath 'com.meituan.robust:auto-patch-plugin:0.4.99'
       }
    }
    
  3. robust.xml文件拷到src同級目錄:

image.png
  1. 實(shí)現(xiàn)PatchManipulate.javaRobustCallBack.java兩個接口

    1. PatchManipulate.java說明:

      /**
       * Created by hedex on 16/6/20.
       */
      public abstract class PatchManipulate {
          /**
           * 獲取補(bǔ)丁列表
           *
           * @param context
           * @return 相應(yīng)的補(bǔ)丁列表
           */
          protected abstract List<Patch> fetchPatchList(Context context);
      
          /**
           * 驗(yàn)證補(bǔ)丁文件md5是否一致
           * 如果不存在,則動態(tài)下載
           *
           * @param context
           * @param patch
           * @return 校驗(yàn)結(jié)果
           */
          protected abstract boolean verifyPatch(Context context, Patch patch);
      
          /**
           * 努力確保補(bǔ)丁文件存在,驗(yàn)證md5是否一致。
           * 如果不存在,則動態(tài)下載
           *
           * @param patch
           * @return 是否存在
           */
          protected abstract boolean ensurePatchExist(Patch patch);
      }
      

      特別說明: patch.setLocalPath()的字符串參數(shù)碍脏,必須跟robust.xml配置的patchPackname字段中的字符串一致,并且類名一定要是 PatchesInfoImpl

    2. RobustCallBack.java方法說明:

      /**
       * Created by hedex on 17/1/22.
       */
      
      public interface RobustCallBack {
          /**
           * 獲取補(bǔ)丁列表后稍算,回調(diào)此方法
           *
           * @param result 補(bǔ)丁
           * @param isNet  補(bǔ)丁
           */
          void onPatchListFetched(boolean result, boolean isNet, List<Patch> patches);
      
      
          /**
           * 在獲取補(bǔ)丁后典尾,回調(diào)此方法
           *
           * @param result 結(jié)果
           * @param patch  補(bǔ)丁
           */
          void onPatchFetched(boolean result, boolean isNet, Patch patch);
      
      
          /**
           * 在補(bǔ)丁應(yīng)用后,回調(diào)此方法
           *
           * @param result 結(jié)果
           * @param patch  補(bǔ)丁
           */
          void onPatchApplied(boolean result, Patch patch);
      
      
          void logNotify(String log, String where);
      
      
          void exceptionNotify(Throwable throwable, String where);
      }
      

使用


  1. 基礎(chǔ)包的預(yù)插樁

    基礎(chǔ)包的預(yù)插樁配置主要在robust.xml文件中配置糊探,主要包括:

    標(biāo)簽 說明
    turnOnRobust 是否打開Robust(只在Release模式下有效)
    forceInsert 是否強(qiáng)制插入代碼钾埂。如果為true,則在debug模式下,也會插入代碼
    catchReflectException 是否捕獲補(bǔ)丁中所有異常科平, (建議上線的時候這個開關(guān)的值為true)
    patchLog 是否在補(bǔ)丁加上log褥紫, (建議上線的時候這個開關(guān)的值為false)
    proguard 項目是否支持proguard,(如果與項目配置不一致瞪慧,打包時會出錯)
    useAsm 插樁是否使用ASM髓考,否則使用javaassist (默認(rèn)使用ASM,推薦使用ASM弃酌,Javaassist在容易和其他字節(jié)碼工具相互干擾)
    forceInsertLambda 針對Java8級別的Lambda表達(dá)式氨菇,編譯為private級別的javac函數(shù),此時由開發(fā)者決定是否進(jìn)行插樁處理
    <packname name="hotfixPackage"> 需要插樁的包名妓湘,或者類名
    <exceptPackname name="exceptPackage"> 不需要插樁的包名查蓉,或者類名
    <patchPackname name="patchPackname"> 補(bǔ)丁的包名,(這里設(shè)置的包名榜贴,必須和PatchManipulateImp中fetchPatchList方法中設(shè)置的補(bǔ)丁類名保持一致)

    準(zhǔn)備就緒后豌研,在安裝或者輸出APK時,Robust就會在build/outputs/robust/目錄下輸出methodsMap.robustmapping.txt。這兩個文件非常重要鹃共,在打包輸出后一定要和APK一起保存鬼佣。

  2. 打補(bǔ)丁包

    1. 在修改代碼之前,需要確定需要打補(bǔ)丁的APK是哪個版本及汉,并將對應(yīng)的methodsMap.robustmapping.txt文件拷貝到app/robust文件下沮趣。

    2. 將APP的build.gradle中的加入

      //制作補(bǔ)丁時將這個打開屯烦,auto-patch-plugin緊跟著com.android.application
      apply plugin: 'auto-patch-plugin'
      
    3. 然后開始修改需要修改的代碼:

      1. 支持方法坷随,類的新增 ------------@Add 或者 RobustModify.modify()
      2. 方法的修改 ------------------------@Modify
      3. 支持新增字段暫時在內(nèi)測,可以通過新增類來實(shí)現(xiàn)
    4. 運(yùn)行程序(安裝驻龟,編譯或者打APK操作都可以)

      這次操作會失敗温眉,目的只是為了生成patch.jar文件,會拋出java.lang.RuntimeException: auto patch end successfully

  3. 下發(fā)補(bǔ)丁 && 補(bǔ)丁包加載

    生成補(bǔ)丁包之后翁狐,然后就是如何將patch.jar下發(fā)到線上應(yīng)用上类溢,或者說,線上應(yīng)用如何得到補(bǔ)丁包露懒。在Demo演示階段闯冷,是將patch.jar 直接push到手機(jī)上,但是線上我們就需要讓應(yīng)用自己將補(bǔ)丁包下載到本地懈词,并自動加載補(bǔ)丁包蛇耀。

    1. 在應(yīng)用冷啟動時,需要檢查是否有新的補(bǔ)丁包坎弯,如果有纺涤,則下載,之后抠忘,驗(yàn)證本地補(bǔ)丁包是否有效撩炊,并加載所有補(bǔ)丁包
    2. 在應(yīng)用處于運(yùn)行階段,如果有補(bǔ)丁包更新崎脉,需要Push推送拧咳,提醒應(yīng)用主動拉新補(bǔ)丁包,并加載新的補(bǔ)丁包

總結(jié)


優(yōu)點(diǎn)

  1. 由于使用的ASM技術(shù)插樁囚灼,Classloader進(jìn)行的類加載骆膝,所以高兼容,高穩(wěn)定性
  2. 補(bǔ)丁可以實(shí)時加載啦撮,實(shí)時生效
  3. 支持ProGuard的混淆谭网,內(nèi)聯(lián),優(yōu)化等操作

缺點(diǎn)

  1. 代碼是侵入式的赃春,會在原有的類中加入相關(guān)代碼
  2. 會增大apk的體積愉择,平均一個函數(shù)會比原來增加17.47個字節(jié),10萬個函數(shù)會增加1.67M

  1. 目前0.4.99對最新的Gradle 6.5是不支持的(issue

  2. Gradle 3.6及以上的版本默認(rèn)啟用了R8,會將插入的changeQuickRedirect變量優(yōu)化掉锥涕,需要在混淆文件proguard-rules.pro中加入以下代碼:

    -keepclassmembers class **{ public static com.meituan.robust.ChangeQuickRedirect *;}
    
  3. 對于方法的返回值是this的情況現(xiàn)在支持不好衷戈,比如builder模式, 但在制作補(bǔ)丁代碼時层坠,可以通過如下方式來解決殖妇,增加一個類來包裝一下(如下面的B類)

    method a(){
      return this;
    }
    

    改為

    method a(){
      return new B().setThis(this).getThis();
    }
    
  4. 不支持構(gòu)造方法的修復(fù)

  5. 不支持資源和SO的修復(fù)

使用時需要注意的點(diǎn) (每一步的操作都不復(fù)雜,但是容易漏掉步驟)

  1. 打基礎(chǔ)包時破花,如果需要在Debug插樁谦趣,需要將打開robust.xml中的forceInsert設(shè)置成true
  2. 打完基礎(chǔ)包之后的methodsMap.robustmapping.txt需要與APK包一起保存,方便查找
  3. 打補(bǔ)丁包時:將對應(yīng)的methodsMap.robustmapping.txt拷貝到app/robust目錄座每,打開apply plugin: 'auto-patch-plugin'自動化打包插件

小結(jié):

  1. 如果項目對熱修復(fù)要求不高前鹅,只是需要更新一些Java層代碼,并且考慮到穩(wěn)定性峭梳,兼容性舰绘,Robust都是一個不錯的熱修復(fù)方案。
  2. 目前Robust方案葱椭,美團(tuán)只是開源的代碼熱修復(fù)方案:前期的基礎(chǔ)包插樁捂寿,以及補(bǔ)丁的自動化,對于補(bǔ)丁的加載策略并沒有具體的方案孵运,并沒有像Sophix一樣提供服務(wù)秦陋,只是預(yù)留了接口。具體的方案需要根據(jù)不同的需求自己實(shí)現(xiàn)
    1. 是讓CI持續(xù)集成自動打補(bǔ)丁包(應(yīng)該是不能交給CI去做)
    2. 本地修改后掐松,直接打補(bǔ)丁包踱侣,手動上傳到服務(wù)器 (涉及到一個服務(wù)器的問題,需要一個服務(wù)器去管理我們的補(bǔ)丁包)
  3. 是否需要支持熱更新大磺,如果需要抡句,服務(wù)器還需要提供push推送服務(wù),當(dāng)有新的補(bǔ)丁包時杠愧,需要推送給APP待榔,讓APP主動下載補(bǔ)丁,并加載流济。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锐锣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绳瘟,更是在濱河造成了極大的恐慌雕憔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糖声,死亡現(xiàn)場離奇詭異斤彼,居然都是意外死亡分瘦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門琉苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲玫,“玉大人,你說我怎么就攤上這事并扇∪ネ牛” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵穷蛹,是天一觀的道長土陪。 經(jīng)常有香客問我,道長俩莽,這世上最難降的妖魔是什么旺坠? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任乔遮,我火速辦了婚禮扮超,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹋肮。我一直安慰自己出刷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布坯辩。 她就那樣靜靜地躺著馁龟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漆魔。 梳的紋絲不亂的頭發(fā)上坷檩,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機(jī)與錄音改抡,去河邊找鬼矢炼。 笑死,一個胖子當(dāng)著我的面吹牛阿纤,可吹牛的內(nèi)容都是我干的句灌。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼欠拾,長吁一口氣:“原來是場噩夢啊……” “哼胰锌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藐窄,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤资昧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荆忍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體格带,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诺凡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了践惑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腹泌。...
    茶點(diǎn)故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尔觉,靈堂內(nèi)的尸體忽然破棺而出凉袱,到底是詐尸還是另有隱情,我是刑警寧澤侦铜,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布专甩,位于F島的核電站,受9級特大地震影響钉稍,放射性物質(zhì)發(fā)生泄漏涤躲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一贡未、第九天 我趴在偏房一處隱蔽的房頂上張望种樱。 院中可真熱鬧,春花似錦俊卤、人聲如沸嫩挤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岂昭。三九已至,卻和暖如春狠怨,著一層夾襖步出監(jiān)牢的瞬間约啊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工佣赖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恰矩,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓茵汰,卻偏偏與公主長得像枢里,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹂午,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本篇文章將帶大家解析Robust框架熱修復(fù)原理 主流的熱修復(fù)框架類型 ClassLoader:將熱修復(fù)的類放在de...
    Jill_Jia閱讀 7,548評論 3 17
  • Robust使用篇 Robust使用相對還是比較簡單的.有一些坑可能官方文檔里講的不是那么詳細(xì),需要自己踏過去 使...
    A邱凌閱讀 1,958評論 0 1
  • 美團(tuán)熱修復(fù)的使用 如何集成栏豺? 在App的build.gradle,加入如下依賴apply plugin: 'com...
    NamelessCoder閱讀 3,508評論 6 9
  • 技術(shù)介紹 Robust的實(shí)現(xiàn) 流程: 1.集成 Robust豆胸,生成 apk奥洼。保存期間的混淆文件 mapping.t...
    Z_Liqiang閱讀 5,522評論 9 11
  • 久違的晴天,家長會晚胡。 家長大會開好到教室時灵奖,離放學(xué)已經(jīng)沒多少時間了嚼沿。班主任說已經(jīng)安排了三個家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,528評論 16 22