patchtool_demo目录下已经有apk和补丁包. 补丁包修复如下
public class BaseBug { public static void test(Context context) { //修复前 Toast.makeText(context.getApplicationContext(), "old apk...", Toast.LENGTH_SHORT).show(); //修复后 //Toast.makeText(context.getApplicationContext(), "new apk...", Toast.LENGTH_SHORT).show(); } }
com.taobao.hotfix.demo
. 然后点击连接应用adb push patchtool_demo/patch_out/hotfix-working/baichuan-hotfix-patch.jar /sdcard/Download
/sdcard/Download/baichuan-hotfix-patch.jar
, 然后点击应用本地补丁按钮./gradlew clean assembleDebug
release:./gradlew clean assembleRelease
), ps:请勿直接使用AS即时编译Instance Run出的apk产物进行打补丁操作.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
命令仅供参考, 使用时需要替换为自己项目相关的路径, 注意使用绝对路径而不是相对路径! 查看命令参数帮助java -jar BCFixPatchTools-1.3.0.jar -c help
正常情况下, hotfix-working目录下将会有
如果没加-sign_file_url
等签名相关参数, 那么只会生成baichuan-hotfix-patch.jar
, 此时补丁也是未签名的!
<init> is filtered <clinit> is filtered
如果有上面的提示, 就说明直接忽略了构造函数的修改或者全局变量(静态变量)的修改.
add modified Method:V test(Landroid/content/Context;) in Class:Lcom/taobao/hotfix/demo/BaseBug; addModifiedClass: com.taobao.hotfix.demo.BaseBug template: Lcom/taobao/hotfix/demo/BaseBug;->test ....
add modified Method
这里表明的就是你代码中要修复的方法, 如果这里有多余的不是你修改的方法.
那么请务必检查
-filter_class_file
参数, 包含在此文件中的类, 将不会打入patch,直接过滤掉类.如果应用了混淆配置
add modified Method:V a(Landroid/content/Context;) in Class:Lcom/taobao/hotfix/demo/a;
查找mapping.txt, 查找对应关系, 可以发现com/taobao/hotfix/demo/a.a(Context context)就是BaseBug.test(Context context)方法
com.taobao.hotfix.demo.BaseBug -> com.taobao.hotfix.demo.a: void test(android.content.Context) -> a
如果有下面的提示, 说明前后apk没发生任何变化.
Error in Patch, please check info below: java.lang.Exception: No apatch files! No classes modify!
本demo中libs下的libtest.so文件只是测试使用, 同时可以看到项目目录结构中包含有armeabi-v7a/arm64-v8a目录, 所以需要把手动把下载sdk中得到的armeabi-v7a/arm64-v8a目录下的libandfix.so文件拷贝进来.
如果没有的话, 则不需要做拷贝处理. x86, x86_64不需要这样处理, hotfix默认不支持这两种架构CPU.
adb logcat -v time | grep "BCHotfix"
在命令行中执行查看反编译baichuan-hotfix-patch.jar补丁包.
apktool d baichuan-hotfix-patch.jar
2.3点中查看smail文件, 看下需要修复的方法是否被正确打入且不能包含多余方法的修改. 如果包含了发现多余无关的方法被打入到了补丁包中, 首先检查apk前后混淆配置是否一样, 然后如果是第三库类方法, 那么可以尝试在打补丁命令中增加
-filter_class_file
参数, 包含在此文件中的类, 将不会打入patch,直接过滤掉类.
文档参考: