patch补丁包生成需要使用到打补丁工具BCFixPatchTools-XXX.jar
, 如还未下载打包工具,请前往文档SDK下载&版本更新记录下载Android打包工具。
java -jar BCFixPatchTools-1.3.0.jar -c help
补丁工具版本更新说明也可以从上述链接中看到. 最新的1.3.0版本已经支持DSA/中文keystore签名, 同时提供了简短的命令行参数同时也不强制需要使用绝对路径, 也可以使用相对路径.
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目录下
终端下执行上面的打补丁命令, 输出如下
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, 那么直接中断打补丁失败