解决 NestHost requires ASM7 (shrink、kotlin metadata)

文章描述了在Android开发中遇到ASM版本与JDK版本不匹配的问题,导致运行时出现NestHostrequiresASM7的异常。作者尝试通过修改Gradle配置、升级ASM版本以及自定义插件来解决问题,最终找到了两种可行的解决方案:一是使用支持ASM6以上的特定插件版本,二是将问题插件代码复制并修改后发布到本地仓库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ASM 版本JDK 版本
ASM5JDK1.5
ASM5JDK1.5
ASM5JDK1.5
ASM5JDK1.5
ASM5JDK1.5
ASM5JDK1.5
ASM5JDK1.5
Java 版本JDK 版本
45JDK1.1
46JDK1.2
47JDK1.3
48JDK1.4
49JDK5.0
50JDK6.0
51JDK7
52JDK8
53JDK9
54JDK10
55JDK11
56JDK12
57JDK13
58JDK14
59JDK15
60JDK16
61JDK17
62JDK18
63JDK19

① 场景

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值