HotFix
Introduction: Android 热补丁修复框架,自动生成带签名的补丁包
Tags:
Issues
- MAC 系统无法自动打包补丁,原因可能是路径分隔符问题
- 使用谷歌 multidex 分包后无法注入代码(开启 multidex 之后,jar 包保存路径改变了)
- 暂不支持 productFlavors
以上问题有空再改,最近正在忙其他事情,公司项目也准备重构。 而且此项目主要是科普和学习热补丁技术,有兴趣的可以自行解决上述问题。
一、HotFix 简介
一个基于 dex 分包的热补丁框架,目前只支持 gradle 1.5 以上版本 具有以下特性:
- 支持混淆
- 自动生成补丁包
- 加载补丁包时进行签名校验
项目演示
二、使用方式
首先在 build.gradle 中有两个 dsl 需要进行配置。
2.1 fixMode
- fixMode 是在 debug 模式下运行项目的配置,可以控制是否使用 javassist 注入代码,是否自动生成补丁,日常开发的话两个设置成 false 即可
- 因为注入代码后,自定义控件在 preview 预览的时候会报空指针(找不到 Antilazy.class),所以需要将 debugOn 关掉才能方便预览。
2.2 fixSignConfig
这个是配置补丁包的签名文件,需要和 Release 签名打包时使用的一致,否则加载补丁的时候会校验失败,这也是为了安全性考虑,防止恶意注入代码。
storeFile,storePassword,keyAlias,keyPassword 对应如下
build.gradle 配置完毕后,只需要运行一次 Release 签名打包,然后修改代码,再次运行 debug 打包即可自动生成补丁了。
三、说明
- 在 Release 签名打包的时候会重新生成 hash.txt,如果开启混淆的话还会生成 mapping.txt,自动生成的补丁包是基于这个版本校验而来的。
- 在 debug 模式下直接运行或者打包会校验 hash.txt 和 mapping.txt,自动生成补丁包并且为补丁包签名。
- 将生成的补丁包复制到 sdcard 根目录,重启应用即可实现热修复。
需要注意的是,如果在 Release 打包中开启了混淆,那么自动生成补丁的时候也需要将 debug 开启混淆,否则会将整个项目的所有类都打包成补丁包。
debug 开启混淆方式如下
3.1 关于签名校验
只有使用 Release 产出的 apk,加载补丁的时候才会进行签名校验。
如果你手机上安装的是 debug 包,那么不会进行签名校验。
3.2 关于 android6.0 以上
补丁包不能从 sdcard 中加载,因为 android6.0 后有运行时权限处理。从 sdcard 中加载只是为了方便测试和演示,一般情况下是建议放在私有目录中。