文章目录

  • 一、 热修复框架简介
    • 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 文件 )相关推荐

  1. 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )

    文章目录 前言 一.IntelliJ IDEA 中创建 Java / Kotlin 工程 二.准备 Java 和 Kotlin 代码 三.编译在 PC 上可执行的 Java / Kotlin JAR ...

  2. 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 )

    文章目录 一.字节码文件 与 JVM 二.字节码文件示例 三.字节码文件二进制结构分析 1.魔数 2.次版本号 3.主版本号 4.常量池个数 一.字节码文件 与 JVM Java 源码编译成 Clas ...

  3. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  4. 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 )

    文章目录 前言 一.常量池结构分析 1.常量池位置 2.常量池结构 3.常量池单个常量 4.常量池单个常量 tag 标签 二.常量池字节码文件分析 0.常量池附加信息 1.常量池 #1 常量分析 2. ...

  5. android java框架_Android 框架简介:java框架

    Android 框架简介:java框架 2015-10-15 14:43  来源: 正保IT教育网整理 这里简单的介绍了Android的java环境基础,在后面一节中会结合具体的实例来理解这一节的内容 ...

  6. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )

    文章目录 一.DexClassLoader 构造函数简介 二.准备 DEX 文件 一.DexClassLoader 构造函数简介 DexClassLoader 构造函数如下 : /*** 创建一个{@ ...

  7. android 复制文件 代码,将android项目从一台计算机复制到另一台计算机后找不到classes.dex文件...

    我已经将两个android项目从一台机器复制到另一台机器上,并且我正试图在模拟器上运行相同的项目,但是每次我得到两个项目相同的错误.错误如下: C:\Users\Abhi\Desktop\Ashish ...

  8. 【原理+实战+视频+源码】java更新无法下载所需安装文件

    造成雪崩的真实场景 1.4.1 服务提供者不可用 硬件故障:如网络故障.硬盘损坏等. 程序的 bug:如算法需要占用大量 CPU 的计算时间导致 CPU 使用率过高. 缓存击穿:比如应用刚重启,短时间 ...

  9. 【Java 虚拟机原理】栈帧 | 动态链接 | 方法区 | 字节码文件二进制分析

    文章目录 前言 一.方法区 二.字节码二进制文件分析 三.动态链接 1.动态链接简介 2.静态链接与动态链接 3.早期绑定 和 晚期绑定 4.动态链接示例 前言 " 栈帧 " 中存 ...

最新文章

  1. mos 多路模拟电子开关_【原创】单火线智能开关技术介绍及分析
  2. 如何制作linux系统硬盘,手把手带你自制Linux系统之二 简易Linux的制作
  3. e: 无法定位软件包_比Ctrl+c,ctrl+v还好用的复制粘贴:Ctrl+d ctrl+r ctrl+e等
  4. matlab改变遥感图像的存储格式
  5. 初中几年级开始学计算机,小学初中什么时候开始准备?该怎么准备?5年级开始晚不晚?...
  6. MitoZ|动物线粒体基因组组装注释软件
  7. Java线程池并发执行多个任务
  8. 万历名士袁宏道的自在人生——独抒性灵,不拘格套
  9. 厉害了,可以不重启JVM就替换掉已经加载的类?
  10. JS高级笔记:CommonJs与ESModule的区别
  11. centos7 下mono安装
  12. 深度学习7 Transformer系列实例分割Mask2Former
  13. HTML5 Canvas可拖动的弹性大树摇摆动画
  14. 花了2万多买的Python教程全套,现在分享给大家……Python入门到精通(Python全栈开发教程)未完待续
  15. 北京内推 | 清华大学周伯文老师课题组招聘助理教授/博士后/工程师/访问学生...
  16. Android Studio 官方示例源码地址
  17. redhat-运维-(2)-selinux-no rout to host
  18. MySQL常用时间函数
  19. word文档docx解密在线网站,word文档docx不能复制打印怎么办?
  20. 上市公司共同机构所有权数据-附顶刊《管理世界》数据应用示例

热门文章

  1. Fedora的ifconfig命令
  2. 推荐些在线小制作小工具
  3. 将某个目录上的Excel表,导入到数据库中.sql
  4. SharePoint 2010设置问卷调查权限
  5. legend3---lavarel多对多模型操作实例
  6. Docker部署ELK 日志归集
  7. 用shell脚本监控进程是否存在 不存在则启动的实例
  8. js基础-字符串常用属性合集
  9. Android之布局RelativeLayout
  10. TCP/IP协议族(一) HTTP简介、请求方法与响应状态码