| ASM 版本 | JDK 版本 |
|---|---|
| ASM5 | JDK1.5 |
| ASM5 | JDK1.5 |
| ASM5 | JDK1.5 |
| ASM5 | JDK1.5 |
| ASM5 | JDK1.5 |
| ASM5 | JDK1.5 |
| ASM5 | JDK1.5 |
| Java 版本 | JDK 版本 |
|---|---|
| 45 | JDK1.1 |
| 46 | JDK1.2 |
| 47 | JDK1.3 |
| 48 | JDK1.4 |
| 49 | JDK5.0 |
| 50 | JDK6.0 |
| 51 | JDK7 |
| 52 | JDK8 |
| 53 | JDK9 |
| 54 | JDK10 |
| 55 | JDK11 |
| 56 | JDK12 |
| 57 | JDK13 |
| 58 | JDK14 |
| 59 | JDK15 |
| 60 | JDK16 |
| 61 | JDK17 |
| 62 | JDK18 |
| 63 | JDK19 |
① 场景
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 以上,发布到本地或私有仓库使用
文章描述了在Android开发中遇到ASM版本与JDK版本不匹配的问题,导致运行时出现NestHostrequiresASM7的异常。作者尝试通过修改Gradle配置、升级ASM版本以及自定义插件来解决问题,最终找到了两种可行的解决方案:一是使用支持ASM6以上的特定插件版本,二是将问题插件代码复制并修改后发布到本地仓库。
20万+

被折叠的 条评论
为什么被折叠?



