熱補(bǔ)丁技術(shù)初探(一)

上月領(lǐng)導(dǎo)有想法雇毫,希望公司能實(shí)現(xiàn)熱更新的技術(shù)與提供解決方案瓦糕,應(yīng)對(duì)一些函數(shù),變量轰绵,配置級(jí)別的bug的修復(fù)莹桅。特去整理了下昌执,整理了三個(gè)可探究的方案:andfix Dexposed ClassLoader。
現(xiàn)在整理下優(yōu)缺點(diǎn):
Dexposed:支持的系統(tǒng)版本统翩,上限是4.4仙蚜,直接pass,采用的AOP切片式思維厂汗,在數(shù)據(jù)統(tǒng)計(jì)這塊有大用途委粉,阿里開(kāi)源的庫(kù),比較老的一個(gè)庫(kù)娶桦;
ClassLoader: 插件式思維贾节,和注入式更新還是有點(diǎn)不一樣;
andfix:支持的系統(tǒng)全面衷畦,阿里2015年開(kāi)源的庫(kù)栗涂,在native層注入代碼,解決思路有點(diǎn)類似IOS的jspatch祈争。
最終決定斤程,采用andfix的解決方案,馬上教程式的給出集成方案菩混。

一忿墅、基礎(chǔ)原理

全稱Android hot-fix,是alibaba的Android熱修復(fù)框架沮峡,支持Android 2.3到6.0的版本疚脐,支持arm與X86系統(tǒng)架構(gòu),支持Dalvik和ART Runtime邢疙。
原理
AndFix的原理就是方法的替換棍弄,把有bug的方法替換成補(bǔ)丁文件中的方法。


原理-替換方法

二疟游、使用教程

1)github上的鏈接
https://github.com/alibaba/AndFix
作為module集成到項(xiàng)目中
2)在AndroidMainFest.xml中生命所需要的權(quán)限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

3) 添加依賴和混淆

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

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}

4)在Application.onCreate()中初始化PatchManager

public class HotPatchApplication extends Application {
    public static PatchManager mPatchManager;
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化patch管理類
        mPatchManager = new PatchManager(this);
        // 初始化patch版本
        mPatchManager.init("1.0");
        // 加載已經(jīng)添加到PatchManager中的patch
        mPatchManager.loadPatch();
    }
}

5)找個(gè)地方加載補(bǔ)丁呼畸,我們這里為了演示,點(diǎn)擊按鈕進(jìn)行加載補(bǔ)丁

findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {   
       @Override    
       public void onClick(View v) {       
             update();   
       }
});
private void update() {    
        String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;    
         try { 
             HotPatchApplication.mPatchManager.addPatch(patchFileStr);    
         } catch (IOException e) {   
            e.printStackTrace();    
        }
}

PatchManager的addPatch方法加載新補(bǔ)丁颁虐,項(xiàng)目中可以在下載補(bǔ)丁文件之后調(diào)用,這里為了演示就把補(bǔ)丁文件放在本地的SD卡中了役耕,代碼中patchFileStr就是補(bǔ)丁存放的位置,.apatch就是生成補(bǔ)丁文件的后綴名聪廉,fix就是補(bǔ)丁文件的名字瞬痘,這里我們將其名字寫(xiě)死。
至此板熊,熱更新的功能代碼全部寫(xiě)完
6)寫(xiě)上測(cè)試是否替代成功的代碼
熱更新覆蓋前的代碼如下:

mainTv = (TextView) findViewById(R.id.main_tv);mainTv.setText("點(diǎn)擊Toast");
mainTv.setOnClickListener(new View.OnClickListener() {    
    @Override    
    public void onClick(View v) {        
        showToast();    
    }
});

private void showToast() {    
        Toast.makeText(this, "打補(bǔ)丁之前", Toast.LENGTH_LONG).show();
}

編譯打包城一個(gè)old.apk(使用release的簽名證書(shū))
熱更新覆蓋的代碼如下:

mainTv = (TextView) findViewById(R.id.main_tv);
mainTv.setText("點(diǎn)擊Toast");
mainTv.setOnClickListener(new View.OnClickListener() {    
      @Override    
      public void onClick(View v) {    
            showToast();  
      }
});

private void showToast() {    
      Toast.makeText(this, "打補(bǔ)丁之后", Toast.LENGTH_LONG).show();
}

編譯打包成一個(gè)new.apk(使用release的簽名證書(shū))框全。

三、測(cè)試過(guò)程

Paste_Image.png

使用andfix中的diff工具執(zhí)行干签,生成一個(gè)appatch文件津辩,命名為fix.appacth

Paste_Image.png

adb push上述fix.appatch文件到sd卡中;
3)


Paste_Image.png

安裝old.apk

4)打開(kāi)app容劳,點(diǎn)擊跟新喘沿,

10230000.jpg

點(diǎn)擊更新按鈕,然后點(diǎn)擊toast按鈕竭贩,應(yīng)當(dāng)能看到 “打補(bǔ)丁之后”的提示蚜印。

git:https://github.com/braveliao/hotupdate

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市留量,隨后出現(xiàn)的幾起案子窄赋,更是在濱河造成了極大的恐慌,老刑警劉巖楼熄,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忆绰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡可岂,警方通過(guò)查閱死者的電腦和手機(jī)错敢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缕粹,“玉大人稚茅,你說(shuō)我怎么就攤上這事≈驴” “怎么了峰锁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)双戳。 經(jīng)常有香客問(wèn)我虹蒋,道長(zhǎng),這世上最難降的妖魔是什么飒货? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任魄衅,我火速辦了婚禮,結(jié)果婚禮上塘辅,老公的妹妹穿的比我還像新娘晃虫。我一直安慰自己,他們只是感情好扣墩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布哲银。 她就那樣靜靜地躺著扛吞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荆责。 梳的紋絲不亂的頭發(fā)上滥比,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音做院,去河邊找鬼盲泛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛键耕,可吹牛的內(nèi)容都是我干的寺滚。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屈雄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼村视!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起棚亩,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蓖议,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后讥蟆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體勒虾,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年瘸彤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了修然。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡质况,死狀恐怖愕宋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情结榄,我是刑警寧澤中贝,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站臼朗,受9級(jí)特大地震影響邻寿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜视哑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一绣否、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挡毅,春花似錦蒜撮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)取逾。三九已至,卻和暖如春薇溃,著一層夾襖步出監(jiān)牢的瞬間菌赖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工沐序, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堕绩。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓策幼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奴紧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子特姐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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