① 场景

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 以上,发布到本地或私有仓库使用

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: