【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )
文章目錄
- 一、修復包 Dex 文件準備
- 二、Odex 優化
- 三、Dex 文件拷貝
- 四、 源碼資源
一、修復包 Dex 文件準備
異常代碼 : 故意寫一個異常代碼 , 并執行該代碼 , 肯定會崩潰 ;
package kim.hsl.hotfix;import android.util.Log;public class HotFixTest {public void test(){if (true) {// 直接拋出異常throw new RuntimeException();}Log.i("HotFixTest", "HotFixTest 執行成功");} }修復后代碼 :
package kim.hsl.hotfix;import android.util.Log;public class HotFixTest {public void test(){if (false) {// 直接拋出異常throw new RuntimeException();}Log.i("HotFixTest", "HotFixTest 執行成功");} }參考 【Android 熱修復】熱修復原理 ( 熱修復框架簡介 | 將 Java 字節碼文件打包到 Dex 文件 ) 二、 將 Java 字節碼文件打包到 Dex 文件 章節流程 , 將更新后的 kim.hsl.hotfix.HotFixTest 類打包成 dex 文件 ;
進入到 " HotFix\app\build\intermediates\javac\debug\classes " 目錄 , 這是生成 Class 字節碼的目錄 , HotFix 是 Android Studio 工程根目錄 ;
刪除 " HotFix\app\build\intermediates\javac\debug\classes\kim\hsl\hotfix " 目錄中除了 HotFixTest.class 之外的其它字節碼文件 ;
執行命令 :
Y:\001_DevelopTools\002_Android_SDK\build-tools\30.0.2\dx.bat
–dex --output
Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\update.dex
Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes
Y:\001_DevelopTools\002_Android_SDK\build-tools\30.0.2\dx.bat --dex --output Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\update.dex Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\指令命令后 , 在 " Y:\002_WorkSpace\001_AS\HotFix\app\build\intermediates\javac\debug\classes\ " 目錄下生成了需要更新的 " update.dex " 文件 ;
( 可以參考 【Android 安全】DEX 加密 ( Java 工具開發 | 生成 dex 文件 | Java 命令行執行 ) 博客內容)
將編譯好的 update.dex 放置到 SD 卡根目錄中 , 下一步開始使用該 dex 文件進行熱修復 ;
二、Odex 優化
修復包就是一個 Dex 文件 , 熱修復框架雖然給生成了一個 .patch 文件 , 其本質還是將 Dex 文件封裝到了 .patch 文件中 ;
Android 應用第一次安裝比較慢 , 這是由于在 Android 5.05.05.0 之后的系統版本中 , 添加了 ART 虛擬機 , 5.05.05.0 之前的系統版本安裝速度很快 ;
老版本的手機安裝 APK 應用 , 只需要幾秒鐘時間 ; 新版本的手機 , 安裝 APK 文件會慢很多 ;
新版手機系統安裝時 , 對 Dex 文件進行了優化 , 將 Dex 文件轉為 Odex 文件 , 系統查找類時 , 加載 Dex 速度很慢 , 將 Dex 優化為 Odex , 從 Odex 中取 Class 字節碼速度要更快一些 ;
三、Dex 文件拷貝
應用運行時不會從 APK 壓縮文件中加載 Class 字節碼文件 , APK 文件安裝在 Android 手機中時 , 將 APK 中的壓縮文件拷貝到 /data/user/包名/app_odex 目錄下 ;
首先獲取 /data/user/包名/app_odex 目錄 , 使用 Context.getDir 目錄時 , 會自動在字符串前添加 “app_” 前綴 , 先將 Dex 文件拷貝到該目錄中 ;
// 拷貝的目的文件目錄// /data/user/0/kim.hsl.hotfix/app_odexFile targetDir = this.getDir("odex", Context.MODE_PRIVATE);// 拷貝的目的文件名稱String targetName = "update.dex";// 準備目的文件, 將 Dex 文件從 SDK 卡拷貝到此文件中String filePath = new File(targetDir, targetName).getAbsolutePath();File file = new File(filePath);if (file.exists()) {file.delete();}// 準備輸入流, 讀取 SD 卡文件InputStream is = null;// 準備輸出流, 輸出到目的文件FileOutputStream os = null;try {// 讀取 SD 卡跟目錄的 update.dex 文件is = new FileInputStream(new File(Environment.getExternalStorageDirectory(), targetName));// 輸出到目標文件os = new FileOutputStream(filePath);int len = 0;byte[] buffer = new byte[1024];while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}// 進行后續操作} catch (IOException e) {e.printStackTrace();} finally {// 關閉 IO 流try {os.close();is.close();} catch (IOException e) {e.printStackTrace();}}四、 源碼資源
源碼資源 :
- GitHub 地址 : https://github.com/han1202012/HotFix
- CSDN 源碼快照 : https://download.csdn.net/download/han1202012/16641987
總結
以上是生活随笔為你收集整理的【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 热修复】热修复原理 (
- 下一篇: 【Android 热修复】热修复原理 (