Part2 生成patch补丁

更新时间:2017/03/15 访问次数:10555

2.1 下载打包工具

patch补丁包生成需要使用到打补丁工具BCFixPatchTools-XXX.jar, 如还未下载打包工具,请前往文档SDK下载&版本更新记录下载Android打包工具。

  • 旧版本的打补丁工具已经不再推荐使用同时也不再提供下载链接, 请使用最新的补丁工具
  • 该工具需要在JDK7或以上才能正常使用
  • 查看补丁工具使用说明java -jar BCFixPatchTools-1.3.0.jar -c help

补丁工具版本更新说明也可以从上述链接中看到. 最新的1.3.0版本已经支持DSA/中文keystore签名, 同时提供了简短的命令行参数同时也不强制需要使用绝对路径, 也可以使用相对路径.

2.2 生成patch

2.2.1 参数说明

  • -c, -cmd: 值为patch: 打补丁命令 值为help: 查看使用说明
  • -s, -src_apk:填写本地的原始APK(有问题的APK). 必选
  • -f, -fixed_apk:已经修复过该问题APK. 必选
  • -w, -wp:输出patch的路径, 最后如果打补丁成功会在wp目录下自动创建的hotfix-working目录生成baichuan-hotfix-patch.jar补丁文件. 必选
  • -k, -sign_file_url:本地的签名文件的路径,不输入则不做签名. 可选
  • -p, -sign_file_pass: 证书文件的密码, 可选
  • -a, -sign_alias: 证书的别名. 可选
  • -e, -sign_alias_pass: 证书别名的密码. 可选
  • -y, -aes_key: 自定义aes秘钥, 必须是16位. 可选
  • -l, -filterClassFilePath:本地的白名单类列表文件的路径,放进去的类不会再计算patch,文件格式: 一行一个类名. 可选

2.2.2. demo示例

java -jar BCFixPatchTools-1.3.0.jar -c patch -s old.apk -f new.apk -w patch-out -k test.keystore -p test123 -a test123 -e test123 -y 1234567891234567 -l filterClass.txt

-y 1234567891234567说明对补丁包进行了加密, 所以需要用这个秘钥进行解密才能正常的解密出最后的补丁包. 如果打补丁过程应用了该参数, 那么sdk初始化过程必须调用setAesKey("1234567891234567")这个方法才行. 否则不需要调用

filterClass.txt文件内容如下: 表示A类和B类不会比较在新旧apk中的差异直接过滤.

a.b.A
a.c.B

最后baichuan-hotfix-patch.jar补丁文件在patch-out/hotfix-working目录下

2.2.3. 打补丁日志详细分析

终端下执行上面的打补丁命令, 输出如下

start to build alibaba baichuan hotfix patch, tool verison: 1.3.0

show filter classes:[a.b.A, a.c.B] -->-l参数值文件内容, 这两个类不计算差异

add modified method:V  test(Landroid/content/Context;)  in Class:Lcom/taobao/hotfix/demo/BaseBug; -->要修复的方法

add modified class: com.taobao.hotfix.demo.BaseBug -->要修复的方法所在的类

add used method:Lcom/taobao/hotfix/util/LogTool;->d:[Ljava/lang/String;|Ljava/lang/String;|[Ljava/lang/Object;] I
add used method:Landroid/content/Context;->getApplicationContext:[] Landroid/content/Context;
add used method:Landroid/widget/Toast;->makeText:[Landroid/content/Context;|Ljava/lang/CharSequence;|I] Landroid/widget/Toast;
add used method:Landroid/widget/Toast;->show:[] V

build prepare class template: Lcom/taobao/hotfix/demo/BaseBug;->test
add prepare class: com.taobao.hotfix.demo.Test
add prepare class: com.taobao.hotfix.demo.MainActivity

start sign patch file -->开始签名补丁

dopatch success, final patch file is: /Users/wuer/Projects/alibaba/hotfix/android_patch_tools/demo-test/patch-out/hotfix-working/baichuan-hotfix-patch.jar -->成功生成补丁文件

add modified class表示的是要修复的类, 所以务必确保这里的类是你实际上修复的类, 但是有时候由于打包本身的问题或者一些第三方库的问题, 此时可能会引入一些第三方无关库的类修复, 此时尝试把这些类添加到-l参数表示的过滤文件中. 但是此时如果引入的是多余的非三方库类修改, 那么具体原因要具体分析. 详情参考«Part4 Android接入常见问题归纳»中的说明

另一方面, 目前我们是不支持新增类method和field的, 如果检测到新apk新增了类method和field, 那么直接中断打补丁失败

FAQ

关于此文档暂时还没有FAQ
返回
顶部