日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

發布時間:2025/6/17 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 文件拷贝 | 源码资源 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。