前言;本文框架
- 什麼是熱修復?
- 熱修復框架分類
- 技術原理及特色
- Tinker框架解析
- 各框架對比圖
- 總結
經過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各種框架的優缺點以及技術原理,文章末尾簡單描述一下Tinker的框架結構。java
1、什麼是熱修復?
1.正常開發流程android
2.熱修復開發流程面試
4.修復什麼?編程
2、熱修復框架分類
1.現狀:百花齊放百家爭鳴;微信
2.簡單分類;架構
3.更合理的分類;app
3、技術原理及特色
3.1 阿里Dexposed -- native解決方案框架
原理:函數
- 直接在native層進行方法的結構體信息對換,從而實現完美的方法新舊替換,從而實現熱修復功能
他的思想徹底來源於Xposed框架,完美詮釋了AOP編程,這裏用到最核心的知識點就是在native層獲取到指定方法的結構體,而後改變他的nativeFunc字段值,而這個值就是能夠指定這個方法對應的native函數指針,因此先從Java層跳到native層,改變指定方法的nativeFunc值,而後在改變以後的函數中調用Java層的回調便可。實現了方法的攔截功能。
- 基於開源框架Xposed實現,是一種AOP解決方案
- 只Hook App自己的進程,不須要Root權限
優勢:
- 即時生效
- 不須要任何編譯器的插樁或者代碼改寫,對正常運行不引入任何性能開銷。這是AspectJ之類的框架無法比擬的優點;
- 對所改寫方法的性能開銷也極低(微秒級),基本能夠忽略不計;
- 從工程的角度來看,熱補丁僅僅是牛刀小試,它真正的威力在於『線上調試』;
- 基於Xposed原理實現的AOP不只能夠hook本身的代碼,還能夠hook同進程的Android SDK代碼,這也就可讓咱們有能力在App中填上Google本身挖的坑。
缺點:
- Dalvik上近乎完美,不支持ART(須要另外的實現方式),因此5.0以上不能用了;
- 最大挑戰在於穩定性與兼容性,並且native異常排查難度更高;
- 因爲沒法增長變量與類等限制,沒法作到功能發佈級別;
3.2 阿里AndFix -- native解決方案
原理:
- 與Dexposed同樣都基於開源框架Xposed實現,是一種AOP解決方案
優勢:
- 即時生效
- 支持dalvik和art(AndFix supports Android version from 2.3 to 7.0, both ARM and X86 architecture, both Dalvik and ART runtime, both 32bit and 64bit.)
- 與Dexposed框架相比AndFix框架更加輕便好用,在進行熱修復的過程當中更加方便了
缺點:
- 面臨穩定性與兼容性問題
- AndFix不支持新增方法,新增類,新增field等
AndFix(Dexpsed)框架不穩定的緣由(痛點)
原理:
- 原理是Hook了ClassLoader.pathList.dexElements[]。由於ClassLoader的findClass是經過遍歷dexElements[]中的dex來尋找類的。固然爲了支持4.x的機型,須要打包的時候進行插樁。
- 越靠前的Dex優先被系統使用,基於類級別的修復
優勢:
- 不須要考慮對dalvik虛擬機和art虛擬機作適配
- 代碼是非侵入式的,對apk體積影響不大
缺點:
- 須要下次啓動纔會生效
- 最大挑戰在於性能,即Dalvik平臺存在插樁致使的性能損耗,Art平臺因爲地址偏移問題致使補丁包可能過大的問題
- 虛擬機在安裝期間爲類打上CLASS_ISPREVERIFIED標誌是爲了提升性能的,咱們強制防止類被打上標誌是否會影響性能?這裏咱們會作一下更加詳細的性能測試.可是在大項目中拆分dex的問題已經比較嚴重,不少類都沒有被打上這個標誌。
插樁方案性能上的痛點:
3.4 美團Robust -- Instant Run 熱插拔原理
原理:
- Robust插件對每一個產品代碼的每一個函數都在編譯打包階段自動的插入了一段代碼,插入過程對業務開發是徹底透明
- 編譯打包階段自動爲每一個class都增長了一個類型爲ChangeQuickRedirect的靜態成員,而在每一個方法前都插入了使用changeQuickRedirect相關的邏輯,當 changeQuickRedirect不爲null時,可能會執行到accessDispatch從而替換掉以前老的邏輯,達到fix的目的。
優勢:
- 幾乎不會影響性能(方法調用,冷啓動)
- 支持Android2.3-8.x版本
- 高兼容性(Robust只是在正常的使用DexClassLoader)、高穩定性,修復成功率高達99.9%
- 補丁實時生效,不須要從新啓動
- 支持方法級別的修復,包括靜態方法
- 支持增長方法和類
- 支持ProGuard的混淆、內聯、優化等操做
缺點:
- 代碼是侵入式的,會在原有的類中加入相關代碼
- so和資源的替換暫時不支持
- 會增大apk的體積,平均一個函數會比原來增長17.47個字節,10萬個函數會增長1.67M。
- 會增長少許方法數,使用了Robust插件後,原來能被ProGuard內聯的函數不能被內聯了
3.5 微信Tinker
原理:
- 服務端作dex差量,將差量包下發到客戶端,在ART模式的機型上本地跟原apk中的classes.dex作merge,merge成爲一個新的merge.dex後將merge.dex插入pathClassLoader的dexElement,原理類同Q-Zone,爲了實現差量包的最小化,Tinker自研了DexDiff/DexMerge算法。Tinker還支持資源和So包的更新,So補丁包使用BsDiff來生成,資源補丁包直接使用文件md5對比來生成,針對資源比較大的(默認大於100KB屬於大文件)會使用BsDiff來對文件生成差量補丁。
優勢:
缺點:
Tinker已知問題:
- Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大組件(1.9.0支持新增非export的Activity);
- 因爲Google Play的開發者條款限制,不建議在GP渠道動態更新代碼;
- 在Android N上,補丁對應用啓動時間有輕微的影響;
- 不支持部分三星android-21機型,加載補丁時會主動拋出"TinkerRuntimeException:checkDexInstall failed";
- 對於資源替換,不支持修改remoteView。例如transition動畫,notification icon以及桌面圖標。
Tinker性能痛點:
- Dex合併內存消耗在vm head上,容易OOM,最後致使合併失敗。
- 若是自己app佔用內存已經比較高,可能容易致使app本系統殺掉。
3.6 阿里Sophix
原理(雙劍合璧):
優化Andfix(突破底層結構差別,解決穩定性問題):
Andfix底層ArtMethod結構時採用內部變量一一替換,卻是這個各個廠商是會修改的,因此兼容性很差。
Sophix改變了一下思路,採用總體替換方法結構,忽略底層實現,從而解決兼容穩定性問題。
突破QQ和Tinker的缺陷
QQ和Tinker的缺陷
Sophix對dex的解決方案
- Dalvik下采用阿里自研的全量dex方案:不是考慮把補丁包的dex插到全部dex前面(dex插樁),而是想辦法在原理的dex中刪除(只是刪除了類的定義)補丁dex中存在的類,這樣讓系統查找類的時候在原來的dex中找不到,那麼只有補丁中的dex加載到系統中,系統天然就會從補丁包中找到對應的類。
- Art下本質上虛擬機以及支持多dex的加載,Sophix的作法僅僅是把補丁dex做爲主dex(classes.dex)而已,至關於從新組織了全部的dex文件:把補丁包的dex更名爲classes.dex,之前apk的全部dex依次改成classes2.dex、classes3.dex ... classesx.dex,以下圖所示。
資源修復另闢蹊徑
經常使用方案(Instant Run技術):這種方案的兼容問題在於替換AssetManager的地方
Sophix資源修復方案
SO修復另闢蹊徑
4、Tinker框架解析
之因此只貼了Tinker的代碼框架,是由於目前開源的方案中是最好的,固然除了Robust。
代碼結構;
修復流程;
這裏後續再補一個詳細的源碼分析,敬請期待
5、對比圖(來自不一樣的地方)
來自Tinker的對比;
來自Sophix的對比;
來自蘑菇街 Android 熱修復探索之路;
6、總結
若是不考慮增大apk的體積,只是簡單的修復代碼,不修復so和資源,選擇Robust是最穩定的,不然的話選擇Tinker是一個不錯的方案。雖然阿里Sophix橫空出世,可是它不開源,並且商業收費,因此通常不是很賺錢的app選擇收費的可能就很小了。不過它確實各方面都作了大量的優化,本文中的不少知識點也來源於阿里的《Android熱修復技術原理.pdf》一書,本書值得一讀,裏面就是基於Sophix框架來編排的。
最後關於做者
做者目前在深圳,13年java轉Android開發,在小廠待過,也去過華爲,OPPO等,去年四月份進了騰訊一直到如今。等大廠待過也面試過不少人。深知大多數初中級Android工程師,想要提高技能,每每是本身摸索成長,不成體系的學習效果低效漫長且無助。
我花了一年時間整理出一份騰訊T4級別的Android架構師全套學習資料,免費分享在個人博客,誠意滿滿,特別適合有3-5年以上經驗的小夥伴深刻學習提高。主要包括騰訊,以及字節跳動,華爲,小米,等一線互聯網公司主流架構技術。若是你有須要,儘管拿走好了。若是有補充和完善,我會特別感激
點擊獲取資料文檔;《騰訊T4級別Android架構師技術腦圖+全套視頻》