Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.14k stars 3.33k forks source link

Warning:ignoreWarning is false, but we found some loader class has been changed in new dex. #746

Closed hqzxzwb closed 6 years ago

hqzxzwb commented 6 years ago

异常类型:编译异常

手机型号:编译异常

手机系统版本:编译异常

tinker版本:1.9.2

gradle版本:plugin 3.0.1, gradle 4.1

是否使用热更新SDK: 无

系统:如:Mac

堆栈/日志:

Warning:ignoreWarning is false, but we found some loader class has been changed in new dex. Such these changes will not take effect!! related classes: {Lcom/tencent/tinker/loader/hotplug/handler/AMSInterceptHandler;,Lcom/tencent/tinker/loader/shareutil/ShareIntentUtil;}

java.lang.RuntimeException: com.tencent.tinker.build.util.TinkerPatchException: some loader class has been changed in new dex. Such these changes will not take effect!! related classes: {Lcom/tencent/tinker/loader/hotplug/handler/AMSInterceptHandler;,Lcom/tencent/tinker/loader/shareutil/ShareIntentUtil;}
        at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:179)
        at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:138)
        at java.nio.file.Files.walkFileTree(Files.java:2670)
        at java.nio.file.Files.walkFileTree(Files.java:2742)
        at com.tencent.tinker.build.decoder.ApkDecoder.patch(ApkDecoder.java:113)
        at com.tencent.tinker.build.patch.Runner.tinkerPatch(Runner.java:65)
        at com.tencent.tinker.build.patch.Runner.run(Runner.java:48)
        at com.tencent.tinker.build.patch.Runner.gradleRun(Runner.java:41)
        at com.tencent.tinker.build.patch.Runner$gradleRun.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at com.tencent.tinker.build.gradle.task.TinkerPatchSchemaTask.tinkerPatch(TinkerPatchSchemaTask.groovy:85)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
。。。若干行gradle的stacktrace省略

代码里未修改以上提到的两个类,最终生成的类我没有逆向看过,我抽空看过以后再把结论发上来。

hqzxzwb commented 6 years ago

找到原因了 混淆后两个类的代码不相同了。

具体的情况是,这两个类里面调用了Exception.printStackTrace,而我们在app中开启了AS3.0的Java8支持,在这种支持模式下,printStackTrace会被替换为静态方法 com.google.devtools.build.android.desugar.runtime.ThrowableExtension.printStackTrace 而我在两次编译中没有保持mapping的一致,导致ThrowableExtension这个类在两次编译混淆后printStackTrace的函数名不相同,进而导致SharedIntentUtil和AMSInterceptHandler里面调用printStackTrace的代码不相同,从而出错。

hqzxzwb commented 6 years ago

建议 Tinker 在修改 proguard 配置时,将 com.google.devtools.build.android.desugar.runtime.ThrowableExtension 加入混淆白名单以解决这类问题。

PrototypeZ commented 6 years ago

@hqzxzwb 把上面这个类加入 proguard 就能解决问题吗?

hqzxzwb commented 6 years ago

@PrototypeZ 可以解决,但要从基础包开始就keep这个类。

PrototypeZ commented 6 years ago

-keep class com.google.devtools.build.android.desugar.runtime.ThrowableExtension{*;}

我把这句话加到 Proguard 里面,还是应用补丁失败,之前一直是好用的,升了 AS 3.0 才出错的 @hqzxzwb

hqzxzwb commented 6 years ago

@PrototypeZ 确认一下基础包也在AS3.0编译,并且keep了这个类吧。如果还是不行,你最好自己逆向看一下相应的类有什么改变,和我这边的问题不一定是一个case。

PrototypeZ commented 6 years ago

@hqzxzwb 已经定位问题了,和你不是一个问题,我的情况是我用的Bugly的服务,tinker 升级以后没有保持 buildscript 里面的依赖和 compile 的依赖都保持最新,全部升级到最新问题解决。还是谢谢你~

liangdong9676 commented 2 years ago

我1.9.14.10也遇到这问题了 我都没有开启混淆