阿里熱修復(fù)方案Sophix實(shí)戰(zhàn)

1鹊汛、前言

前段時間在微信的一個公眾號看到了一篇文章
阿里震撼業(yè)界—推出首個非侵入式熱修復(fù)方案Sophix旷痕,顛覆移動端傳統(tǒng)發(fā)版更新流程亚兄!
對此非常感興趣下翎,因?yàn)橐恢币詠碜约阂蚕胍陧?xiàng)目中加入熱更新的功能缤言,曾經(jīng)試過了微信的Tinker,Gradle配置起來也有點(diǎn)點(diǎn)麻煩漏设,構(gòu)建的過程時間也比較長墨闲,當(dāng)時項(xiàng)目比較趕,也就沒有繼續(xù)往下實(shí)踐了郑口。

看到了阿里的Sophix方案引入確實(shí)比較方便鸳碧,簡單到只需要兩句代碼,當(dāng)然犬性,實(shí)踐起來還是有很多需要注意的地方瞻离,如有不慎,恐怕會引起崩潰乒裆。

阿里云移動熱修復(fù)Sophix官網(wǎng):https://www.aliyun.com/product/hotfix

2套利、非侵入性(原話)

我們的打包過程不會侵入到apk的build流程中。我們所需要的鹤耍,只有已經(jīng)生成完畢的新舊apk肉迫,而至于apk是如何生成的——是Android Studio打包出來的、還是Eclipse打包出來的稿黄、或者是自定義的打包流程喊衫,我們一律不關(guān)心。在生成補(bǔ)丁的過程中間既不會改變?nèi)魏未虬M件杆怕,也不插入任何AOP代碼族购,我們極力做到了——不添加任何超出開發(fā)者預(yù)期的代碼,以避免多余的熱修復(fù)代碼給開發(fā)者帶來困擾陵珍。


3寝杖、實(shí)踐中的一些問題

接入步驟可查看官方文檔,比較簡單互纯,下面是寫入Application的兩句代碼

// initialize最好放在attachBaseContext最前面
SophixManager.getInstance().setContext(this)
                .setAppVersion(appVersion)
                .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)部引擎異常, 推薦此時清空本地補(bǔ)丁, 防止失敗補(bǔ)丁重復(fù)加載
                            // SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它錯誤信息, 查看PatchStatus類說明
                        }
                    }
                }).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中瑟幕,否則無網(wǎng)絡(luò)權(quán)限,建議放在后面任意時刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
3.1收苏、多次補(bǔ)丁的情況亿卤,基線包需要多次修復(fù)補(bǔ)丁
image

已經(jīng)修復(fù)了V.1版本,當(dāng)需要更新V.2版本的補(bǔ)丁鹿霸,應(yīng)該是以哪個為基線包?應(yīng)該是使用哪個補(bǔ)陡讶椤懦鼠?這里V版本是基線包,patch3是補(bǔ)丁屹堰。

3.2肛冶、項(xiàng)目在Android4.4版本會遇到崩潰現(xiàn)象,應(yīng)該如何避免扯键?

Sophix的初始化代碼要在Application的最前面睦袖,而且盡量使用系統(tǒng)的類,不要使用log等荣刑,最好就是什么代碼都不寫馅笙,回調(diào)方法也不寫代碼,確保不會發(fā)生崩潰現(xiàn)象厉亏。Sophix在修復(fù)的時候回整包dex修復(fù)董习,如果有其他代碼可能會影響到修復(fù)過程。

3.3爱只、Android5.0多dex分包的處理

實(shí)踐的過程中遇到皿淋,項(xiàng)目方法數(shù)大于64k,已經(jīng)采用dex分包技術(shù)恬试,最小支持的API版本如果大于21窝趣,即Android5.0的時候,編譯出來的apk包解壓后可能會有好幾十個dex分包(如下圖所示训柴,正常來說應(yīng)該是1哑舒、2個),該問題會導(dǎo)致在差分包打補(bǔ)丁的時候會出錯畦粮,因此只需要修改最小支持的API版本在5.0以下即可散址。


image
3.4、項(xiàng)目使用360加固宣赔,能否支持预麸?

測試過了,是支持的儒将。但我個人的測試范圍比較小吏祸,在阿里釘釘群里面有人反映,360加固后會出現(xiàn)崩潰現(xiàn)象钩蚊,且再也無法啟動贡翘,只能卸載重裝蹈矮。這里我沒遇到過,但官方客服并沒有說支持鸣驱,也就是說泛鸟,出現(xiàn)問題并不會快速響應(yīng)幫忙解決。

3.5踊东、采用代碼混淆 + 不加固的方式來發(fā)布應(yīng)用北滥,對于混淆文件mapping.txt的處理

應(yīng)用在上線打包APK時,往往會進(jìn)行混淆操作闸翅,但是由于修復(fù)前后兩個APK混淆結(jié)果不同會導(dǎo)致patch無效再芋,無法修復(fù)bug。所以坚冀,需要注意的是:應(yīng)用打包APK的時候修復(fù)前后兩個APK必須使用同一份mapping.txt济赎,以保證兩個APK混淆結(jié)果一致。

如果app應(yīng)用了混淆配置记某,那么需要做如下處理司训。打包之前,將mapping.txt文件移動到了當(dāng)前模塊的目錄下辙纬,再將混淆文件proguard-rules.pro進(jìn)行如下操作豁遭。

#基線包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路徑下贺拣,移動到/app路徑下
#修復(fù)后的項(xiàng)目使用蓖谢,保證混淆結(jié)果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize
3.6、項(xiàng)目中多版本譬涡、Debug闪幽、Release版本的熱修復(fù)控制

建議不需要熱更新的版本在

initialize()
queryAndLoadNewPatch()

方法之前加入判斷,不然會報錯涡匀。

3.7盯腌、對比騰訊微信Tinker熱修復(fù)方案

騰訊微信Tinker方案也非常強(qiáng)大,也有一個完善的補(bǔ)丁后臺管理陨瘩,不需要我們的后臺接入就能夠輕松實(shí)現(xiàn)熱修復(fù)的功能腕够。

但有個問題,Tinker需要在Gradle配置里面做比較多的配置腳本舌劳,導(dǎo)致編譯的時候也會非常占用時間帚湘,接入成本相對Sophix來說更大一些。

3.8甚淡、更多問題

官方FQ Android接入問題


4大诸、更深入的學(xué)習(xí)《深入理解Android熱修復(fù)技術(shù)原理》

免費(fèi)下載!業(yè)界首部安卓熱修復(fù)寶典出爐,阿里技術(shù)大牛聯(lián)袂推薦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末资柔,一起剝皮案震驚了整個濱河市焙贷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贿堰,老刑警劉巖辙芍,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異羹与,居然都是意外死亡沸手,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門注簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跳仿,你說我怎么就攤上這事诡渴。” “怎么了菲语?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵妄辩,是天一觀的道長。 經(jīng)常有香客問我山上,道長眼耀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任佩憾,我火速辦了婚禮哮伟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妄帘。我一直安慰自己楞黄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布抡驼。 她就那樣靜靜地躺著鬼廓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪致盟。 梳的紋絲不亂的頭發(fā)上碎税,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音馏锡,去河邊找鬼雷蹂。 笑死,一個胖子當(dāng)著我的面吹牛眷篇,可吹牛的內(nèi)容都是我干的萎河。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虐杯!你這毒婦竟也來了玛歌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤擎椰,失蹤者是張志新(化名)和其女友劉穎支子,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體达舒,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡值朋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巩搏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昨登。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贯底,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禽捆,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布胚想,位于F島的核電站,受9級特大地震影響浊服,放射性物質(zhì)發(fā)生泄漏统屈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一臼闻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧述呐,春花似錦、人聲如沸乓搬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽进肯。三九已至激蹲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間学辱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工策泣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人统抬。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓危队,卻偏偏與公主長得像聪建,于是被迫代替她去往敵國和親茫陆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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