Android 热修复调研

Sophix

AndFixGitHub 上的最后一次提交记录是在三年前了,而且提的很多 issue 也没有人回复,估计是放弃这个方案了,在推 Sophix .

Sophix:

支持方法级别的修复

支持资源的修改,添加

补丁包较小

傻瓜式接入

看了下官网的介绍,然后自己集成了一下他的SDK,模拟了几个问题,依次生成补丁包,修复,走了一遍流程

我这里试了三个版本的 4.46.09.0 的都可以成功修复

补丁是对应的指定版本走的,假如

生成补丁包:(为了使新旧两个包使用同样的混淆规则,需要以下步骤)

生成补丁失败检查步骤

1. 打有问题的包的时候需要在 proguard-rules.pro 中 打开 -printmapping mapping.txt 关闭 -applymapping mapping.txt

2. 打完有问题的包之后需要把 mapping.txt 文件拷贝到 app/目录下, 然后把上面的两个配置切换

3. 再打修复了问题的包

4. 之后再生成补丁
缺点
1. 不支持添加四大组件

2. 不支持 修改 AndroidManifest.xml

3. Application中不得使用非Android SDK 的方法

4. 获取到有补丁之后大概率会强制走冷启动,重新打开的时候修复问题

    文档中的说法是:代码若变动小,一般会走即时生效热修复,而如果代码变动大,比如在已存在的类中新增方法,修改了so等情况,都会走冷启动。这是由打包工具自行检测代码变化来判断的

4. 在application的onCreate中会去请求有没有新的补丁,如果还没请求到数据就闪退了,那么就没办法了, 所以需要在启动页面拖着时间,保证能够顺利请求到补丁
冷启动热启动

默认不会强制杀死APP,但是有些问题只有冷启动之后才会被修复

1. 只改不增方法,热启动 当前页面的修复不了,新的页面可以修复

2. 新增方法,冷启动才能修复

Robust 美团热修复方案

Robust 刚上手感觉比 Sophix 麻烦一些,实际用下来确实麻烦一些

优点:

支持实时修复,不需要重新启动应用,当前类的也可以修复

新增字段不支持,不过可以通过将字段放在新的类来达到目的

Lamda 表达式(比如 (v -> LogUtil.d("xxx") )) 修改不了,文档上说是在里面添加 RobustModify.modify(); 实测不好使,没效果,可以添加一个新的类来解决

        补丁中添加点击事件的时候不要直接

            setOnClickListener(new View.OnClickListener{
                // ignore
            })

        这样补丁修复不成功,应该添加一个新的类 XXX,实现 View.OnClickListener 接口,然后setOnClickListener(new XXX())

            @Add
            public static class XXX implements View.OnClickListener{
                // ignore
            }

缺点:

代码侵入,每个修改的方法上面都要加 `@Modify` 注解,新增的方法要加 `@Add` 注解

不支持资源的修复
生成补丁的时候失败:
patch method com.meituan.sample.robusttest.SampleClass.multiple(int) haven't insert code by Robust.Cannot patch this method, method.signature  (I)I

这表明我们想要打补丁的方法并没有被robust插入代码,Robust对一个方法里面只有字段调用的方法的没有插入代码,简单的来说就是这个方法里面都是字段(局部变量和成员变量)的方法,没有方法调用,new操作等,这类方法被我们归类为简单方法,可以在调用这个方法的地方修复这个问题。
如果加载补丁提示找不到类,那么需要配置混淆规则,不要把配置代码混淆掉
踩了个坑:
setPatchesInfoImplClassFullName 的参数需要是 robust.xml 中 <patchPackname/>的包名,类名必须是 PatchesInfoImpl
setPatchesInfoImplClassFullName("com.meta.robustdemo.robust.PatchesInfoImpl")
又踩了个坑:
把 patch.jar 往手机里推的时候
用的 adb push ./patch.jar /storage/emulated/0/robust/
在 OPPO A57t 上面可以,但是 OPPO R7, 1+7Pro上面都不可以
一直说找不到文件,最后用
adb push ./patch.jar /storage/emulated/0/robust/patch.jar

总结

Sophix

默认不会强制杀死APP,但是有些问题只有冷启动之后才会被修复

    1. 只改不增方法,热启动 当前页面的修复不了,新的页面可以修复

    2. 新增方法,冷启动才能修复

    修复时长:计算code9到code12的时间

    	第一次加载补丁在1.5-2s左右,加载完之后就检测不到新的补丁

Robust

    支持实时修复,不需要重新启动应用,当前类的也可以修复

    修复时长:第一次加载补丁在200-300ms左右,之后再加载再25-45ms左右
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值