Android热修复

开发中我们会遇到如下的情况:

  • 重新发布版本代价太大
  • 用户下载安装成本太高
  • BUG修复不及时,用户体验太差
    热修复就是解决以上问题。使用热修复后可以达到无需重新发版、用户无感知修复、无需下载新的应用的目标,代价小,从而把损失降到最低。此功能目前仅支持Android平台。

进入功能界面

进入Light控制台 > APP,点击列表中的一个APP,进入实时发布的热修复页面,展示APP版本列表以及各版本的最近发布情况。如下图所示:

新增APP版本

点击“添加APP版本”按钮,在弹框中填入要添加的APP版本信息,点击“确定”,即可新增一个APP版本。

表单参数说明

APP版本:填写需要进行修复的APP版本。

删除APP版本

点击需要删除的APP版本的“删除”按钮,弹出删除确认弹框,确认后,该版本将被删除。删除版本前,需保证该版本下没有正在发布的任务。

发布

点击需要发布的APP版本的“发布”按钮,进入发布页面。如下图所示:

添加补丁包

点击发布页面上的“添加补丁包”按钮,在弹框中填入补丁包的信息,填写完成后点击“确定”。需要注意的是:上传新的补丁包后,该APP版本下的所有历史补丁包将不可再进行发布。

表单参数说明

补丁包:补丁文件,仅支持jar格式,且不能超过5M。
版本号:补丁版本号,默认为上一版本+1。
补丁描述:补丁描述,描述该补丁主要修复的问题,可不填。

回滚

热修复提供发布回滚功能,用户发布过版本后,可选择回滚到基线版本或补丁版本。

回滚到补丁版本:只能回滚到已正式发布过的补丁。回滚后会在补丁包列表中新增一条记录,并创建正式发布任务,历史补丁包任务全部停止。

回滚到基线版本:将清除所有的历史补丁,清除后不可恢复。

补丁发布

点击补丁包列表右侧对应的“发布”按钮,即可完成补丁包的发布。一个补丁包只能同时进行一个任务。若要创建新的任务,必须先停止正在发布中的任务。

注意:发布类型选择“正式发布”时,历史所有发布任务都将被停止,且不可再对此补丁包进行灰度发布。

生成补丁包

使用补丁包生成工具,对比原apk文件和修复后的新apk文件,可生成出补丁包。

使用方法:

  1. 在文件夹中放置apkpatch-1.0.0.jar、old.apk、new.apk、hotfix_config.xml和签名文件xxxx.keystore;
  2. 设置hotfix_config.xml内容:
<?xml version="1.0" encoding="UTF-8"?> 
<patch>
<issue id="property">
<!--there are some cases we may get some warnings, default false-->
<ignoreWarning value="true"/>

<!--whether sign the patch file default true-->
<useSign value="true"/>

<!--if you don't set sevenZip path, we just use 7za to try-->
<sevenZipPath value="D:/7za"/>

<!--If this attribute is true, the generated patch package will contain a-->
<!--dex including all changed classes instead of any dexdiff patch-info files.-->
<isProtectedApp value="false"/>

<!--fixType cold:冷启动 , hot:实时 ,默认为cold-->
<fixType value="cold"/>
</issue>
<issue id="dex">
<!--only can be 'raw' or 'jar'. for raw, we would keep its original format-->
<!--for jar, we would repack dexes with zip format.-->
<!--if you want to support below 16, you must use jar-->
<dexMode value="jar"/>

<!--what dexes in apk are expected to deal with tinkerPatch-->
<!--it support * or ? pattern.-->
<pattern value="classes*.dex"/>

<!--Warning, it is very very important, loader classes can't change with patch.-->
<loader value="com.hundsun.hotfixgmu.*"/>
<loader value="com.hundsun.application.base.*"/>
<loader value="com.hundsun.application.base.SingletonManagerMultiDexApplication"/>
</issue>
<issue id="sign">
<path value="xxxxx.keystore"/>
<storepass value="xxxxx"/>
<keypass value="xxxx"/>
<alias value="xxxxx"/>
</issue>
</patch>
  1. 使用cmd工具执行:
    java -jar apkpatch-1.0.0.jar -old old.apk -new new.apk -config hotfix_config.xml -out output
  2. 执行后,会生成output文件夹,里面的xxxx.jar文件为补丁包。

注意:apk请先集成hotfixgmu组件!