【Android 热修复】热修复原理 ( 修复包 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.0 5.0 5.0 之后的系统版本中 , 添加了 ART 虚拟机 , 5.0 5.0 5.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_odex
File 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 telephony_android获取真实时间
- android sdk根目录,Android SDK位置
- android短信验证码方案,Android之短信验证码
- Android修改字体_android设置字体样式
- android ANR产生原因和解决办法
- 【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程结构 )
- 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )
- 【Android Gradle】安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )
- 【Android 逆向】Android 系统文件分析 ( cpuinfo 处理器信息文件 | self 当前进程信息文件 | meminfo 当前内存信息文件 )
- 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
- 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 )
- 【Google Play】Android 应用用户协议 ( 生成用户协议 | HTML 用户协议模板 | Markdown 用户协议模板 )
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ③ ( 在 Gradle 构建脚本中实现 AndroidManifest.xml 清单文件切换设置 )
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- 【Android OpenCV】Visual Studio 创建支持 OpenCV 库的 CMake 工程 ③ ( CMake 工程中配置 OpenCV 库文件 | 拷贝 OpenCV 函数库文件 )
- Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件详解手机开发
- [android] 手机卫士输入框抖动和手机震动详解手机开发
- android的RadioGroup讲解详解手机开发
- Android LruCache技术原理详解手机开发
- Android基站定位原理及实现代码
- 解析Android资源文件及他们的读取方法详解
- Android字符串资源文件format方法使用实例
- android开发教程之系统资源的使用方法android资源文件