Android熱更新之初探

什么是熱修復(fù)祖今?

熱修復(fù)提出于2014年歧斟,興起于2016年紧武,尤其是在Instant run 問世以后击你,各種熱修復(fù)技術(shù)相繼涌出玉组。
是一種擺脫傳統(tǒng)發(fā)版方案直接使用補(bǔ)丁來更新app內(nèi)容谎柄,不需要重新下載安裝apk等略過一系列繁瑣過程的新興技術(shù),目前國內(nèi)部分成熟App都擁有自己的熱修復(fù)技術(shù)惯雳,如:手淘朝巫、QQ、微信石景、美團(tuán)劈猿、餓了么等。

熱修復(fù)有什么優(yōu)勢&為什么要使用熱修復(fù)潮孽?

來看一個場景:公司一個項(xiàng)目A在上線后發(fā)現(xiàn)一個嚴(yán)重bug如果不緊急修復(fù)可能導(dǎo)致用戶流失糙臼,這種情況下如果是傳統(tǒng)的app更新就很麻煩了大概是這個流程:


這期間重新發(fā)版涉及到提交測試環(huán)節(jié),這樣修復(fù)一個bug很不及時(shí)恩商,如果使用熱修復(fù)方案变逃,它將變得很簡單:


其優(yōu)勢為:

  • 無需重新發(fā)版,簡單高效
  • 用戶無感知怠堪,無需下載新應(yīng)用揽乱,代價(jià)小
  • 修復(fù)成功率高,挽回用戶群體

熱修復(fù)是如何工作的粟矿?

  • 2017年6月手淘聯(lián)合阿里云正式發(fā)布了新一代非侵入式Android熱修復(fù)方案 - Sophix
    它能修復(fù):代碼凰棉、資源、SO庫陌粹,下圖為Sophix與微信和餓了么熱修復(fù)技術(shù)對比表

從表中我們能知道個大概撒犀,就是Sophix似乎更值得使用一下。
分別介紹QQ空間超級不定掏秩、微信Tinker和Sophix的前身HotFix各自的工作原理或舞。

首先了解一下apk的執(zhí)行過程:代碼被編譯Build后生成apk文件,其實(shí)在里面生成了一個classes.dex文件蒙幻。

我們解壓一個apk文件如下圖:



這個classes.dex就是所有代碼的集合映凳,是一個可執(zhí)行文件,android運(yùn)行apk實(shí)質(zhì)是解壓apk運(yùn)行里面的這個的dex文件邮破。
apk首次運(yùn)行的時(shí)候會對這個dex文件進(jìn)行優(yōu)化诈豌,優(yōu)化后生成一個odex文件,存在于緩存中抒和,下次再啟動就直接打開這個odex文件矫渔,達(dá)到快速打開目的。而執(zhí)行apk的過程就是遍歷這個dex并作出相應(yīng)操作的過程摧莽,遍歷后的dex方法存放在一個Elements數(shù)組中庙洼,它的長度限制是65536.即日常說的65K.
如果我們apk因?yàn)樘嫶蠡蛘呤且萌綆焯鄬?dǎo)致方法數(shù)超過65K,就會報(bào)錯.
而谷歌已經(jīng)在Android 5.0開始支持Multdex.

在知道上面信息后,我們談?wù)勥@三家的熱修復(fù)是如何實(shí)現(xiàn)的
1.QQ空間超級補(bǔ)丁:基于DEX分包方案送膳,使用了多DEX加載的原理员魏,大致的過程就是:把BUG方法修復(fù)以后,放到一個單獨(dú)的DEX里叠聋,插入到dexElements數(shù)組的最前面撕阎,讓虛擬機(jī)去加載修復(fù)完后的方法。


當(dāng)patch.dex中包含Test.class時(shí)就會優(yōu)先加載碌补,在后續(xù)的DEX中遇到Test.class的話就會直接返回而不去加載虏束,這樣就達(dá)到了修復(fù)的目的.

2.微信Tinker:微信針對QQ空間超級補(bǔ)丁技術(shù)的不足提出了一個提供DEX差量包,整體替換DEX的方案厦章。主要的原理是與QQ空間超級補(bǔ)丁技術(shù)基本相同镇匀,區(qū)別在于不再將patch.dex增加到elements數(shù)組中,而是差量的方式給出patch.dex袜啃,然后將patch.dex與應(yīng)用的classes.dex合并汗侵,然后整體替換掉舊的DEX文件,以達(dá)到修復(fù)的目的群发。


3.AndFix:不同于QQ空間超級補(bǔ)丁技術(shù)和微信Tinker通過增加或替換整個DEX的方案晰韵,提供了一種運(yùn)行時(shí)在Native修改Filed指針的方式,實(shí)現(xiàn)方法的替換熟妓,達(dá)到即時(shí)生效無需重啟雪猪,對應(yīng)用無性能消耗的目的。

AndFix與HotFix的關(guān)系如下:


AndFix實(shí)現(xiàn)原理:


AndFix實(shí)現(xiàn)過程:


更詳細(xì)的說明戳這里:三大流派之簡單對比

阿里云Sophix熱修復(fù)之簡單使用

Sophix集成示例:

第一步:找到Project的build.gradle文件起愈,在allProjects節(jié)點(diǎn)下加上如下代碼:
repositories {
          maven { url"http://maven.aliyun.com/nexus/content/repositories/releases"}
}
第二步:找到Module的build.gradle文件只恨,添加依賴:

compile'com.aliyun.ams:alicloud-android-hotfix:3.0.7'
然后同步project

第三步:添加權(quán)限,SDK使用到以下權(quán)限
  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--<! -- 外部存儲讀權(quán)限,調(diào)試工具加載本地補(bǔ)丁需要 –>-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

READ_EXTERNAL_STORAGE/ACCESS_WIFI_STATE 權(quán)限屬于Dangerous Permissions,自行做好android6.0以上的運(yùn)行時(shí)權(quán)限獲取

第四步:密鑰等配置抬虽,在application節(jié)點(diǎn)下加入以下配置:
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密鑰" />
第五步:登錄阿里云熱修復(fù)管理控制臺官觅,填入對應(yīng)3個value
第六步:代碼集成

在Application的attachBaseContext方法里加入Sophix初始化

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        SophixManager.getInstance().setContext(this)
                .setAppVersion(getAppVersion())
                .setAesKey(null)
                .setEnableDebug(true)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 補(bǔ)丁加載回調(diào)通知
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明補(bǔ)丁加載成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新補(bǔ)丁生效需要重啟. 開發(fā)者可提示用戶或者強(qiáng)制重啟;
                            // 建議: 用戶可以監(jiān)聽進(jìn)入后臺事件, 然后應(yīng)用自殺
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 內(nèi)部引擎異常, 推薦此時(shí)清空本地補(bǔ)丁, 防止失敗補(bǔ)丁重復(fù)加載
                             SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它錯誤信息, 查看PatchStatus類說明
                        }
                    }
                }).initialize();
    }
       
    @Override
    public void onCreate() {
        super.onCreate();
        ......
       // queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網(wǎng)絡(luò)權(quán)限斥赋,建議放在后面任意時(shí)刻缰猴,如onCreate中
        SophixManager.getInstance().queryAndLoadNewPatch();
}

自此SDK的集成已經(jīng)差不多完成,官方給出了很詳細(xì)的集成方法疤剑,官方集成文檔

第七步:生成熱修復(fù)補(bǔ)丁

我們直接看官方文檔這里面寫的很詳細(xì),細(xì)到每個設(shè)置每個參數(shù)都有說明

第八步:調(diào)試并發(fā)布補(bǔ)丁

首先我們需要上傳補(bǔ)丁到阿里云管理后臺闷堡,點(diǎn)此查看詳細(xì)操作
接下來是對補(bǔ)丁的調(diào)試隘膘,點(diǎn)此查看詳細(xì)操作
調(diào)試沒毛病后,發(fā)布補(bǔ)丁杠览,參考管理后臺使用說明的step5

查看我自己的Demo數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弯菊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子踱阿,更是在濱河造成了極大的恐慌管钳,老刑警劉巖钦铁,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異才漆,居然都是意外死亡牛曹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門醇滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黎比,“玉大人,你說我怎么就攤上這事鸳玩≡某妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵不跟,是天一觀的道長颓帝。 經(jīng)常有香客問我,道長窝革,這世上最難降的妖魔是什么躲履? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮聊闯,結(jié)果婚禮上工猜,老公的妹妹穿的比我還像新娘。我一直安慰自己菱蔬,他們只是感情好篷帅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拴泌,像睡著了一般魏身。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚪腐,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天箭昵,我揣著相機(jī)與錄音,去河邊找鬼回季。 笑死家制,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泡一。 我是一名探鬼主播颤殴,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鼻忠!你這毒婦竟也來了涵但?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矮瘟,沒想到半個月后瞳脓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澈侠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年劫侧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埋涧。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡板辽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棘催,到底是詐尸還是另有隱情劲弦,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布醇坝,位于F島的核電站邑跪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呼猪。R本人自食惡果不足惜画畅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宋距。 院中可真熱鬧轴踱,春花似錦、人聲如沸谚赎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壶唤。三九已至雳灵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闸盔,已是汗流浹背悯辙。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迎吵,地道東北人躲撰。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像钓觉,于是被迫代替她去往敵國和親茴肥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

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