1:需求背景
项目上线之后,发现BUG需要修复(比如安卓兼容性等测试难以发现的问题),频繁的更新影响用户体验
2:方案要求
静默下载,耗费流量少,打完补丁后立刻生效,不用重启apk
3:解决思路
3.1:使用andfix,打出差异包,使用补丁的方式安装
3.2:缺陷:只能支持源码级别函数的修改(全局变量、新增、删除方法都是无效的)
4:修复BUG、创建差异包步骤
基于andfix原理,每次版本更新后,之前版本打的热修复补丁都会失效,这也符合我们上图的修复步骤。
因为每次热修复的修改,都会被合并到下个版本中了
5:APK热修复打补丁流程
补充描述:
1:服务端补丁包字段如下:
- patchId: 补丁包的唯一标识md5值,用于客户端校验补丁包合法性,以及本地记录该补丁包是否已经打过
- url:下载地址
2:客户端打包记录表:
使用sqlLite记录每次打包的结果,用于避免重复打包,字段如下:
- patchId:同上文
- isSuccess: 打包是否成功
3:apk版本号
我们目前使用VersionCode作为版本号
6:常见问题
1:后台静默下载热修复补丁,会不会耗费流量?
一般而言,每次热修复补丁的体积仅为4KB左右,仅涵盖两个版本差异部分
2:andfix兼容性怎么样?
目前试验了oppo、小米、魅族、moto、nexus,涵盖android 4.0~6.0;
仅在oppo上发现了打补丁包会出现闪退的情况,但是再次进入,发现补丁包已经生效了
把打补丁这个过程放到子线程之后,oppo崩溃的情况没再出现
3:android 6.0权限问题会影响到热修复吗?
会。因为下载补丁需要涉及到读取和写入外置存储设备权限,当然了,你也可以把补丁包放置在内部存储设备上避免这个问题
4:下载的补丁包删除了,会使得补丁失效吗?
不会,只要打成功了,就永久可用了。只有apk版本升级之后,才会使之前打上的补丁包失效
5: 用不同的秘钥打出来的热修复包可以使用吗?
不可以,andFix源码里面有对修复包携带的秘钥信息进行判断,安全性很高。