【Android 热修复】热修复原理 ( 热修复框架简介 | 将 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 Pro] java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常
- Androidi性能优化之Java代码优化(摘自Android性能优化一书)
- JAVA Eclipse开发Android如何让屏幕保持为竖直或水平状态
- 性能优化之Java(Android)代码优化
- LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android
- android内存管理
- Atitit.嵌入式web 服务器 java android最佳实践
- Android、Java 获取时间戳、年月日、时间戳转换为具体时间
- android 11.0 SystemUI导航栏 添加虚拟按键(一)
- android 屏蔽系统输入法自定义输入法的详解
- 【Android Gradle 插件】将自定义 Gradle 插件上传到自建 Maven 仓库 ② ( java 和 groovy 插件自带文档任务 | 自定义文档打包任务 | 生成文档包 )
- 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )
- 【错误记录】Android Studio 编译时 lint 检查报错 ( Could not resolve junit:junit:4.+. )
- 【Groovy】Android Studio 中创建 Groovy 工程 ( 创建 Android Studio 工程 | 创建并改造 Java 依赖库 | 编写 Groovy 代码并运行 )
- 【Android 内存优化】Java 引用类型 ( 强引用 | 软引用 | 弱引用 | 虚引用 )
- Android经常使用自己定义控件
- Android 下拉刷新上拉载入效果功能
- Android一些解决方案内存问题(一)
- Android设置RadioButton在文字的右边
- Android Framework 保姆级开发学习路线,全套资料包开源分享
- 【Android】0、Android 开发从入门到实战超详细路线图
- Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8. You can try some of
- Android app性能优化
- Unity 调用Android中的java代码