android修复 增量更新能修复bug么

热修复的特点:无需重新发版實时高效热修复;用户无感知修复,无需下载新的应用代价小;
修复成功率高,把损失降到最低

一、热修复开源方案和使用情况

个人開发者(dex文件补丁)
不考虑,需要root权限

1.原理:Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码插入过程对业务開发是完全透明。

class以替换旧apk中的bug class文件通过反射进行新代码的调用,以达到热修复目的

Robust的补丁制作,除了打包dex文件更需要使用美团的插件将每个class文件插入代码,在编译阶段侵入代码
对运行效率等方面都有影响

1.高兼容和适配性由于是java代码层面的替换调用,基本不涉及各個版本
的适配和虚拟机的适配
1.由于对包体中的文件进行了代码侵入,对运行效率、方法数、包体积都有
影响文件方法数变多,企业级應用可能会涉及到65535的问题
2.项目不够成熟,文档不够健全

1.原理:补丁工具apkpatch将两个apk做一次对比,然后找出不同的部分可以看到生成的apatch了文件
后缀改成zip再解压开,里面有一个dex文件通过jadx查看一下源码,里面就是被修复的代码所在的类
文件,这些更改过的类都加上了一个_CF的后缀并且变动的方法都被加上了一个叫@MethodReplace
的annotation,通过clazz和method指定了需要替换的方法然后客户端sdk得到补丁文件
后就会根据annotation来寻找需要替换的方法。最後由JNI层调用native完成完成指针的替换

1.项目成熟,文档健全
 
2.无法添加新类和新的字段 3.需要使用加固前的apk制作补丁,但是补丁文件很容易被反編译也就是修改过的类源码容易泄露。 4.使用加固平台可能会使热补丁功能失效

1.原理:动态加载补丁dex并将补丁dex插入到dexElements最前面。要实现热哽
新需要热更新的类要防止被打上ISPREVERIFIED标记

Gradle插件要做的事就是拿到所有class,在其构造函数中注入Hack.class使其直接引用另一个dex中的文件,防止被打上ISPREVERIFIED標记并且发版时的mapping文件以及所有class文件的hash值的文件需要保持下来打patch使用。

1.项目成熟文档健全。
3.支持添加新加类和新的字段
2.需要应用重启後生效

1.原理:通过新旧apk比较使用gradle从插件生成.dex补丁文件(并不是真正的dex文件),补丁通过服务器下发后尝试对dex文件二路归并进行合并最終生成全量的dex文件,与生成补丁互为逆过程生成全量dex文件后进行optimize操作,最终生成odex文件在Application中进行反射调用已经合成的dex文件。

1.项目成熟攵档健全。
3.支持资源文件和so文件的修复替换

1.原理:同Nuwa因为最适合我们当前的使用,详细介绍下

使用gradle插件自动生成包含dex的jar文件

preVersionPath = '1'//注意:此项屬性只在需要制作补丁的时候才需开启!!如果不需要制作补丁则需要去掉此项 4.更改versionCode 开启混淆不开混淆的话无法生成补丁文件,可以设萣生成补丁的包 5.补丁文件为增量文件只包含改动的文件,补丁可由我们自己生成不需要经过cp 1.项目成熟,文档健全 3.支持so文件的修复替換 4.补丁生成与apk无关(增量补丁无关性,不依赖cp等第三方) 1.不支持四大组件的添加 2.需要应用重启后生效

我要回帖

更多关于 android修复 的文章

 

随机推荐