技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch

简介: 关于 Android 热修复方案——DexPatch 的介绍与使用说明

影院开放营业漫画风卡通公众号首图 (1).jpg



方案介绍

为了解决 Native 模块上线后的问题,mPaaS 提供了热修复功能,实现不发布客户端 apk 场景下的热修复。目前 Android 端热修复主要包括 andfix 和 dexpatch,考虑到 andfix 的版本兼容性,目前主要推荐使用 DexPatch


DexPatch 修复原理比较简单,就是在启动后通过 RPC 拉取当前需要下发的 jar 包地址,然后通过独立进程去下载 jar 包文件,下载完成后保存。在二次启动的时候 hook 系统的 classLoader,修改 DexPathList,在其数组的最前面加入一个有修改过的 class 的 dex 文件,使其拦截住数组后面的 dex 文件中同名的 class 的加载。


如下图所示,classloader 就会优先加载 Patch.dex 中的 Ding.class,而忽略 Classes.dex 中的 Ding.class,达到了替换的效果。  

1.png


基于这样的原理,DexPatch 具有以下特征:

  1. 支持范围上:是基于类级别的替换,所以只支持 Java 模块的 patch,不支持非 Java 模块的 patch,比如 so 模块;
  2. 兼容性上:由于是代理了系统的 ClassLoader,使用的黑科技较少,所以整体方案兼容性较好;
  3. 生效时效性上:只能在下载 patch 后重启后才能生效,不支持实时生效;
  4. 成功率上:由于下载是使用的独立进程,减少了启动阶段主进程闪退对 patch 下载的影响,提升了下载的成功比例。



操作说明

以下是关于在 mPaaS 下使用 DexPatch 模块的主要步骤以及问题排查思路,方便开发者日常开发。

1. 触发 patch 拉取

启动阶段调用 MPHotpatch.init(),主要触发 Patch 信息的 RPC 请求,如果命中发布 Patch 发布规则,RPC 会返回 Patch 的 jar 包下载地址,客户端去触发下载,下载后保存在客户端私有目录/data/user/0/包名/dexpatch/patch/下。

2.png


2. 代码操作演示

以组件化模式接入为例,介绍下 Patch 发布的主要流程。

(1)代码改动前

3.png


需要保存改动前的构建产物,方便后续做 Patch 生成,地址在:build/intermediates/bundle/xxxx-raw.jar


(2)代码改动后

4.png


重新编译,保存构建产物,产物地址:build/intermediates/bundle/xxxx-raw.jar


(3)生成白名单配置

主要用于热修复包时用于指定修复的类,配置文件为 .txt 格式,该配置文件应包含并按顺序包含以下信息:
需要 Patch 的类。以 L 开头,后跟以混淆后真实类名。如果多个类,每行只可写一个。示例:Lxxx.xxx.clazzX设置 Patch 类型为 dexpatch。示例:PatchType: dexpatch


设置是否是静态 Bundle。默认为 false,如果是静态链接的 Bundle,需要显式设置为 true。示例:HostDex: true(*目前 mPaaS 客户端的模块一般都在静态链接里,一般写 true)5.png


(4)查看签名

生成 patch 需要用到项目的打包秘钥,需要提前准备好,可以在打包脚步下找到对应的配置

6.png


(5)生成 patch

① 通过 mPaaS 自带的 IDE 工具,点击热修复,进入修复页面。

7.png


② 按照页面提示,填入之前准备的修复前和修复后的 jar 包地址,还有白名单配置文件,勾选 dexPatch,进入到下一步

8.png


③ 下一步主要选择打包的配置文件,最近点击完成生成 patch 文件

9.png


(6)生成 patch 产物

生成 patch 产物如下:

10.png


查看产物,可以使用 dex2jar 工具反解 diff.dex 文件,用 jd-gui 文件查看反解产物是否符合预期

11.png


反解后可以看到修改的模块:

12.png


(7)上传发布

① 选择上一步的产物 jar 包进行上传

13.png


② 上传后可以通过白名单进行发布,验证 patch 的稳定性

14.png


(8)验证下载

白名单发布后,启动客户端,搜索关键字:DynamicRelease,可以看到在 tool 进程有触发下载的日志打出。
这里需要说明的是,这里触发 patch 的下载是在 tool 进程,不在主进程的主要原因是怕由于主进程由于启动导致重复闪退,导致 patch 不能下载成功,单独在 tool 进程实现下载,尽量提高 patch 的下载成功比例。

15.png


然后去下载目录查看,是否下载保存成功,下载目录在:/data/user/0/包名/dexpatch/patch/20201023110012@20201023110012.jar

16.png


(9)杀进程启动

确认下载保存成功后,杀掉 App,重启查看是否生效,重启可以搜索关键字:DexPatchManager,查看 patch 生效的日志,日志会打印当前是否存在 patch 以及 patch 是否加载的日志。

17.png


同时我们也可以就实际业务场景进行验证,查看是否生效。



常见问题

1. aar 模式集成后 patch 没生效

aar 模式集成的时候,需要继承框架的 QuinoxlessApplication,指定 Application 为框架的实现类才能实现 dexpatch 的加载。QuinoxlessApplication 内主要封装了 dexpatch 模块的初始化和加载。


2. 使用加固后不生效

需要使用加固前的 apk 生成 patch,不能用加固后的包生成 patch。然后还需要验证在不同加固厂商下的兼容表现。


3. 使用热修复后,和 RPC 有关的调用发生 apache http 相关的 crash。

请使用 Android 官网上的方式引入 apache http client,禁止使用导入 jar 包或者 gradle implementation/compile 的方式导入 http client。否则会引起 classloader 加载类混乱。


建议方式:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

* 如有更多疑问,欢迎钉钉搜索“32930171”加入「mPaaS 技术交流群」


E · N · D

作者名片-荣阳.jpg


底部banner.png

相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1699 4
|
11月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
1063 95
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
817 64
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
751 11
移动端数据抓取:Android App的TLS流量解密方案
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
1196 156
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1126 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
621 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
494 14
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
369 13
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。

热门文章

最新文章

相关产品

  • 移动开发平台 mPaaS