前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

作者头像
韩曙亮
发布2023-03-29 09:38:29
7040
发布2023-03-29 09:38:29
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、 热修复框架简介


热修复框架 : 热修复框架有很多 , 只选择几个典型的进行对比研究 ;

  • 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

代码语言:javascript
复制
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 文件进行应用热修复 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、 热修复框架简介
    • 1、类替换
      • 2、so 替换
        • 3、资源替换
          • 4、全平台支持
            • 5、生效时间
              • 6、性能损耗
                • 7、总结
                • 二、 将 Java 字节码文件打包到 Dex 文件
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档