【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )
文章目錄
- 一、 熱修復框架簡介
- 1、類替換
- 2、so 替換
- 3、資源替換
- 4、全平臺支持
- 5、生效時間
- 6、性能損耗
- 7、總結
- 二、 將 Java 字節碼文件打包到 Dex 文件
一、 熱修復框架簡介
熱修復框架 : 熱修復框架有很多 , 只選擇幾個典型的進行對比研究 ;
- Tinker : 微信 ;
- QZone : Q 空間 ;
- AndFix : 阿里 ;
- Robust : 美團 ;
下面從幾個方面的功能及性能分析上述四個熱修復框架 ;
1、類替換
類替換 :
Java 類源碼文件編譯成 class 字節碼文件 , 然后轉為 dex 文件 , 打包到 apk 中 , 然后在 Android 平臺的 Dalvik虛擬機 或 Art 虛擬機中執行 ;
類替換就是將 Java 類編譯后的字節碼 , 進行完整的替換 ;
Tinker , QZone 熱修復框架支持類替換 ;
Tinker , QZone 是以 Java 層作為修復的對象 ;
AndFix , Robust 熱修復框架不支持類替換 , 使用的是定點替換修復的機制 ;
AndFix , Robust 是以 ndk 層作為修復的對象 ;
ndk 層自然無法進行 Java 層的類替換 ;
2、so 替換
so 替換 : 替換 ndk 的 so 庫 ;
Tinker 可以替換 so 庫 ;
QZone , AndFix , Robust 不能替換 so 庫 ;
3、資源替換
Tinker , QZone 框架可以替換資源 ;
AndFix , Robust 不能替換資源 ;
4、全平臺支持
Tinker , QZone , AndFix , Robust 都可以全平臺支持 ;
5、生效時間
Tinker , QZone 不支持即時生效 ;
AndFix , Robust 只要熱修復完畢 , 即時生效 ;
6、性能損耗
Tinker , AndFix , Robust 性能損耗較小 ;
QZone 性能損耗較大 ;
7、總結
開源的熱修復框架中 , 綜合所有的要素 , 推薦使用 Tinker 熱修復框架 , 除了即時生效的時效性之外 , 其它性能參數都可以接受 ;
二、 將 Java 字節碼文件打包到 Dex 文件
程序出現 BUG , 修復好之后 , 發布修復包到服務器中 , 應用通過網絡將修復包下載到手機中 ;
修復包的格式問題 : 修復好的 Java 代碼編譯后是 Class 字節碼文件 , 需要轉為 Dex 格式 , 才能在 Android 虛擬機中執行 ;
獲取字節碼文件 : 字節碼文件在 Module 目錄下的 " build\intermediates\javac\debug\classes " 目錄中 , 如下圖所示 ;
將需要修復的 Class 字節碼文件保留 , 刪除不需要修復的字節碼文件 ;
這里只需要修改 MainActivity.Java 源碼 , 只保留該文件的字節碼文件 MainActivity.class , 其它文件刪除 ;
將需要修復的 Class 字節碼文件打包成 dex 文件 :
將上述整個 " build\intermediates\javac\debug\classes " 整個目錄拷貝到一個容易操作的目錄 ;
操作指定目錄 : 進入包名目錄的上一級目錄 , 包名是 kim.hsl.keep_progress_alive , MainActivity 的完整包名類名是 kim.hsl.keep_progress_alive.MainActivity , 其所在的目錄是 " D:\dex\classes\kim\hsl\keep_progress_alive\MainActivity.class " , 進入 " D:\dex\classes\ " 目錄進行操作 ;
執行命令 :
D:\001_Programs\001_Android\002_Sdk\Sdk\build-tools\30.0.2\dx.bat
–dex --output
D:\dex\classes\update.dex
D:\dex\classes
D:\001_Programs\001_Android\002_Sdk\Sdk\build-tools\30.0.2\dx.bat --dex --output D:\dex\classes\update.dex D:\dex\classes指令命令后 , 在 " D:\dex\classes " 目錄下生成了需要更新的 " update.dex " 文件 ;
( 可以參考 【Android 安全】DEX 加密 ( Java 工具開發 | 生成 dex 文件 | Java 命令行執行 ) 博客內容)
將編譯好的 update.dex 放置到 SD 卡中 , 就可以在應用中加載該 dex 文件進行應用熱修復 ;
總結
以上是生活随笔為你收集整理的【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 进程保活】应用进程拉活
- 下一篇: 【Android 热修复】热修复原理 (