HotFix

Project Url: AItsuki/HotFix
Introduction: Android 热补丁修复框架,自动生成带签名的补丁包
More: Author   ReportBugs   
Tags:

Issues

  1. MAC 系统无法自动打包补丁,原因可能是路径分隔符问题
  2. 使用谷歌 multidex 分包后无法注入代码(开启 multidex 之后,jar 包保存路径改变了)
  3. 暂不支持 productFlavors

以上问题有空再改,最近正在忙其他事情,公司项目也准备重构。 而且此项目主要是科普和学习热补丁技术,有兴趣的可以自行解决上述问题。

一、HotFix 简介

一个基于 dex 分包的热补丁框架,目前只支持 gradle 1.5 以上版本 具有以下特性:

  1. 支持混淆
  2. 自动生成补丁包
  3. 加载补丁包时进行签名校验

项目演示

image

二、使用方式

首先在 build.gradle 中有两个 dsl 需要进行配置。

image

2.1 fixMode

  • fixMode 是在 debug 模式下运行项目的配置,可以控制是否使用 javassist 注入代码,是否自动生成补丁,日常开发的话两个设置成 false 即可
  • 因为注入代码后,自定义控件在 preview 预览的时候会报空指针(找不到 Antilazy.class),所以需要将 debugOn 关掉才能方便预览。

2.2 fixSignConfig

这个是配置补丁包的签名文件,需要和 Release 签名打包时使用的一致,否则加载补丁的时候会校验失败,这也是为了安全性考虑,防止恶意注入代码。

storeFile,storePassword,keyAlias,keyPassword 对应如下

image

build.gradle 配置完毕后,只需要运行一次 Release 签名打包,然后修改代码,再次运行 debug 打包即可自动生成补丁了。

三、说明

  1. 在 Release 签名打包的时候会重新生成 hash.txt,如果开启混淆的话还会生成 mapping.txt,自动生成的补丁包是基于这个版本校验而来的。
  2. 在 debug 模式下直接运行或者打包会校验 hash.txt 和 mapping.txt,自动生成补丁包并且为补丁包签名。
  3. 将生成的补丁包复制到 sdcard 根目录,重启应用即可实现热修复。

需要注意的是,如果在 Release 打包中开启了混淆,那么自动生成补丁的时候也需要将 debug 开启混淆,否则会将整个项目的所有类都打包成补丁包。

debug 开启混淆方式如下

image

3.1 关于签名校验

只有使用 Release 产出的 apk,加载补丁的时候才会进行签名校验。

如果你手机上安装的是 debug 包,那么不会进行签名校验。

3.2 关于 android6.0 以上

补丁包不能从 sdcard 中加载,因为 android6.0 后有运行时权限处理。从 sdcard 中加载只是为了方便测试和演示,一般情况下是建议放在私有目录中。

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea