技术干货 | 深度解构 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

 

 

作者:荣阳

原文链接

本文为阿里云原创内容,未经允许不得转载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李飞飞:阿里云数据库已做好全面服务政企市场的准备

“政企市场是检验云数据库产品竞争力的黄金标准。”9月3日&#xff0c;阿里云智能数据库事业部总负责人李飞飞在北京举办的媒体沟通会上表示&#xff0c;阿里云已经做好全面服务政企数据库市场的准备&#xff0c;并已成功助力多家大型组织实现核心系统对传统商业数据库的替换。…

技术改变生活 浅谈阿里云混合云的探索与实践

简介&#xff1a; 也许你并不了解“阿里云混合云”&#xff0c;甚至没有听说过“混合云”&#xff0c;然而它却在幕后“默默”改变着人们的生活。 也许你并不了解“阿里云混合云”&#xff0c;甚至没有听说过“混合云”&#xff0c;然而它却在幕后“默默”改变着人们的生活。大…

公网访问_一文读懂阿里云访问公网的实现方式

NAT网关与EIP作为公有云服务商&#xff0c;提供互联网的访问和接入是必备的条件&#xff0c;阿里云也不例外。和AWS类似&#xff0c;阿里云访问公网的组件为NAT网关和弹性IP&#xff0c;对于刚刚接触云的童鞋&#xff0c;今天这篇文章带你彻底了解这两个组件的使用场景。弹性IP…

阿里巴巴云原生应用安全防护实践与 OpenKruise 的新领域

简介&#xff1a; 得益于 Kubernetes 面向终态的理念&#xff0c;云原生架构天然具备高度自动化的能力。然而&#xff0c;面向终态的自动化是一把“双刃剑”&#xff0c;它既为应用带来了声明式的部署能力&#xff0c;同时也潜在地会将一些误操作行为被终态化放大。 因此&#…

什么是微内核架构设计?

简介&#xff1a; 作为一名Java程序员&#xff0c;相信同学们都听说过微内核架构设计&#xff0c;也有自己的理解。那么微内核是如何被提出来的&#xff1f;微内核在操作系统内核的设计中又有什么作用&#xff1f;本文从插件化(Plug-in)架构的角度来诠释微内核架构设计&#xf…

给力!斩获 GitHub 14000 Star,两周创办开源公司获数百万美元融资

上世纪 90 年代初&#xff0c;21 岁大学生 Linus Torvalds 开源 Linux 操作系统&#xff0c;自此掀起全球开源浪潮。随后“中国 Linux 第一人”宫敏博士用手提肩背的方式将 20 盒磁带背回中国&#xff0c;磁带里装着 80G 容量的自由软件&#xff0c;组建起中国第一个自由软件库…

函数计算镜像加速:从分钟到秒的跨越

简介&#xff1a; 函数计算 FC 正式发布容器镜像加速&#xff0c;通过按需读取和更高效的解压技术在不同场景下加速 50%-80%&#xff0c;即使 GB 级别的镜像也可以在几秒内完成端到端启动。 FaaS 和容器 容器镜像因其颠覆式创新成为云原生时代应用部署格式的事实标准。头部云厂…

阿里云CDN产品经理陈章炜:边缘创新技术和落地实践

简介&#xff1a; CDN除了加速外&#xff0c;不断被赋予更多价值。在阿里云CDN推出的《极速奔跑吧 2021》首场直播中&#xff0c;阿里云架构师和产品经理不仅对近期阿里云发布的CDN产品最佳实践图进行了详细解读&#xff0c;还对CDN产品和客户的场景如何更高效地匹配、形成最优…

极狐GitLab:从硅谷到中国,远程办公背后的挑战与创新

编辑 | 宋 慧 供稿 | 极狐&#xff08;GitLab&#xff09; 头图 | 付费下载于视觉中国 最近&#xff0c;海外的互联网巨头们纷纷开启了远程办公的政策&#xff0c;谷歌允许员工提出更换办公地点的要求或申请成为永久远程办公者&#xff0c;目前已经批准了近 8000 名员工在家办公…

E百科 | 基于MEC的边缘AI服务

简介&#xff1a; 阿里云边缘计算团队付哲解读5G下热门场景&#xff1a;边缘AI。作者&#xff1a;阿里云付哲&#xff0c;计算机科学与技术专业博士后&#xff0c;在流量检测、资源调度领域有深入研究&#xff0c;其论文《Astraea: Deploy AI Services at the Edge in Elegant …

网速dns怎么调快_怎么设置dns?教你快速解决网速慢的问题

体内惊人荒之力很的洪&#xff0c;设置速解速慢设置速解速慢了一但其大批企业高成中中隐藏优质长的&#xff0c;复活&#xff0c;一旦。特斯提高金拉2的第度为的产大量的资7年能投入了三季&#xff0c;教决网仅生0辆产了&#xff0c;理想并不其效果却&#xff0c;交付2辆只有实…

“凡尔赛”式晒校园生活?移动云 9.9 风暴手把手教你!

快开学了卧虎藏龙的校园当然也少不了“凡尔赛大师”看看普通版和进阶版的凡尔赛学霸学神们如何用最低调的话炫最高调的耀LETS GO!考/试/篇假/期/篇生/活/费/篇看完学霸与学神的凡尔赛较量除了羡慕他们能够凡尔赛的资本更重要的是了解到移动云校园套餐原来如&#xff01;此&…

开源微服务运行时 Dapr 发布 1.0 版本

简介&#xff1a; Dapr 是 2019 年 10 月开源的分布式运行时。早在 Dapr 开源初期&#xff0c;阿里云就开始参与 Dapr 社区建设和代码开发&#xff0c;目前已有两位 Dapr 成员&#xff0c;是 Dapr 项目中除微软之外代码贡献最多的公司。作为 Dapr 项目的早期采用者&#xff0c;…

如何应用数据模型

简介&#xff1a; 数据模型对于常规的数据查询或填写数据提交&#xff0c;是否有使用场景或者价值&#xff1f;数据模型这条路走的是否有问题&#xff1f; 一 前言 Vmo 是我在 18 年发布的一个工具库&#xff0c;用于快速创建数据模型&#xff0c;当时我写了一篇文章《Vmo 前端…

一行代码,揭开 CPU 执行原理!

作者 | 轩辕之风O来源 | 编程宇宙技术计算机如何执行你的代码&#xff1f;知乎上有人提问&#xff1a;电脑怎样执行编程语言的&#xff1f;很多刚刚入坑的小白可能对此完全没有概念&#xff0c;或者模模糊糊知道个大概&#xff0c;我们写下的一行行代码&#xff0c;计算机到底是…

有赞 Flink 实时任务资源优化探索与实践

简介&#xff1a; 目前有赞实时计算平台对于 Flink 任务资源优化探索已经走出第一步。 随着 Flink K8s 化以及实时集群迁移完成&#xff0c;有赞越来越多的 Flink 实时任务运行在 K8s 集群上&#xff0c;Flink K8s 化提升了实时集群在大促时弹性扩缩容能力&#xff0c;更好的降…

mysql怎么看端口号_mysql端口号(怎么查看mysql的端口号)

mysql端口号(怎么查看mysql的端口号)2020-05-07 21:54:58共10个回答如何查看mysql的端口号1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注意修…

Serverless 如何在阿里巴巴实现规模化落地?

简介&#xff1a; 2020 年&#xff0c;我们在 Serverless 底层基建上做了非常大的升级&#xff0c;比如计算升级到了第四代神龙架构&#xff0c;存储上升级到了盘古 2.0&#xff0c;网络上进入了百 G 洛神网络&#xff0c;整体升级之后性能提升两倍&#xff1b;BaaS 层面也进行…

php验证mysql内数据_MySQL中数据类型的验证_MySQL

CHARchar (M) M字符&#xff0c;长度是M*字符编码长度&#xff0c;M最大255。验证如下&#xff1a;mysql> create table t1(name char(256)) default charsetutf8;ERROR 1074 (42000): Column length too big for column name (max 255); use BLOB or TEXT insteadmysql>…

专访合一智芯杨桦:做AI芯片核心技术的底层设计师

核心IP设计是国产化芯片的关键&#xff0c;杨桦是这个细分领域的一名创业者。作为曾在威盛电子和ARM公司工作过的芯片领域的老将&#xff0c;他一直追寻的目标就是给“中国芯”最好的设计。 作者 | 王查娜 来源 | 中国高新网 深研AI芯片设计 杨桦本科毕业于北京航空航天大学…