① 场景
Caused by: java.lang.RuntimeException: NestHost requires ASM7
Failed to resolve class org/vigame/demo/CrashHandler$1.class[
transform input:not found
project input:not found
aar input:not found]
Caused by: java.lang.UnsupportedOperationException: NestHost requires ASM7
at org.objectweb.asm.ClassVisitor.visitNestHost(ClassVisitor.java:174)
at org.objectweb.asm.tree.ClassNode.accept(ClassNode.java:399)
at com.ss.android.ugc.bytex.common.visitor.ClassVisitorChain.accept(ClassVisitorChain.java:65)
at com.ss.android.ugc.bytex.common.processor.ClassFileAnalyzer.handle(ClassFileAnalyzer.java:102)
1、异常抛出位置
访问该类的嵌套宿主类。嵌套是同一包的一组类,它们共享对其私有成员的访问。其中一个类称为host,
列出了嵌套的其他成员,这些成员依次应链接到其嵌套的宿主。此方法只能调用一次,
并且仅当访问的类是嵌套的非宿主成员时。类隐式地是它自己的嵌套,因此以访问的类名作为参数调用此方法是无效的。
嵌套类(外部类):可以在一个类的内部定义另一个类(内部类)
2、查看源码
查看得知 shrink 默认使用的是 ASM6
3、解决
尝试一:fork 分支,修改默认值,重新发布版本到本地或私有仓库
发版本过程中一番折腾竟然没有成功!既然是一个可选的配置项,肯定是不会写死的,那就一定有地方可配置!!!
尝试二:在 gradle.properties 配置满足要求的 bytex.ASM_API
shrink transformClasses 总算是编译通过
② 场景
但是别高兴太早,下面还有一个错误呢!
Execution failed for task ':app:transformClassesWithRemoveKtMetaForCommonRelease'.
> NestHost requires ASM7
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task
':app:transformClassesWithRemoveKtMetaForCommonRelease'
Caused by: java.lang.UnsupportedOperationException: NestHost requires ASM7
at org.objectweb.asm.ClassVisitor.visitNestHost(ClassVisitor.java:174)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:586)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
at com.android.kt.meta.remove.RemoveKtMetaPlugin2.doModifyClass(RemoveKtMetaPlugin2.kt:150)
at com.android.kt.meta.remove.RemoveKtMetaPlugin2.modifyClassIfNeeded(RemoveKtMetaPlugin2.kt:200)
at com.android.kt.meta.remove.RemoveKtMetaPlugin2.transform(RemoveKtMetaPlugin2.kt:262)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:284)
at com.android.build.gradle.internal.profile.NoOpAnalyticsService.recordBlock(NoOpAnalyticsService.kt:72)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:242)
1、找到 TransformTask,修改 ASM 版本?
(未果)
寻找是否有地方可配置 ASM,无结果啊!
2、继续细看日志
有 databinding,可是我的项目根本没有使用到这个啊!
> Task :app:transformClassesWithRemoveKtMetaForCommonRelease FAILED
remove_kt_meta::transform,ext.enable=true
remove_kt_meta::pkg:0\androidx\databinding need remove Route
remove_kt_meta::0\androidx\databinding\DataBinderMapperImpl.class modify done
remove_kt_meta::pkg:0\androidx\databinding need remove Route
remove_kt_meta::0\androidx\databinding\DataBindingComponent.class modify done
remove_kt_meta::pkg:0\androidx\databinding\library\baseAdapters need remove Route
remove_kt_meta::0\androidx\databinding\library\baseAdapters\BR.class modify done
remove_kt_meta::pkg:0\com need remove Route
remove_kt_meta::0\com\dywdyk.class modify done
remove_kt_meta::pkg:0\com\unity3d\player need remove Route
remove_kt_meta::0\com\unity3d\player\UnityPlayerActivity.class modify done
remove_kt_meta::pkg:0\org\vigame\demo need remove Route
搜索果然发现开启了 databinding,关闭它!!!
发现没,日志变少了
> Task :app:transformClassesWithRemoveKtMetaForCommonRelease FAILED
remove_kt_meta::transform,ext.enable=true
remove_kt_meta::pkg:0\com need remove Route
remove_kt_meta::0\com\rkjzmk.class modify done
remove_kt_meta::pkg:0\com\unity3d\player need remove Route
remove_kt_meta::0\com\unity3d\player\UnityPlayerActivity.class modify done
remove_kt_meta::pkg:0\org\vigame\demo need remove Route
。
。
。
。
。
。
然而没有啥用,两天没解决这个错误,崩溃了老铁。
。
。
。
。
。
。
3、发现了!!!
一直看 kotlin-gradle-plugin
的源码从未找到过,原来是下面那个
根据调用栈日志,翻阅代码查看,果然和上面的 shrink
是一样,默认写了 AMS6
Finally,终于解决了
方式一:
寻求更高的合适版本(需 asm6 以上)的
classpath "com.google.plugin.kt:remove-metadata:1.0.5"
【这个我没有再找高版本了】
方式二:
此插件代码复制出来,新建工程,修改super(393216,cv)
为 ASM6 以上,发布到本地或私有仓库使用