Android N (--min-api 24): void butterknife.Unbinder.lambda$static$0()

在引入Butterknife版本9.0.0-rc2后,遇到Android N编译错误:Static interface methods only supported starting with Android N (--min-api 24)。解决方案是为项目添加Java 8支持。

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

引入最新com.jakewharton:butterknife:9.0.0-rc2后,出现:

Caused by: com.android.tools.r8.utils.AbortException: Error: Static interface methods are only supported starting with Android N (--min-api 24): void butterknife.Unbinder.lambda$static$0()
    at com.android.tools.r8.utils.Reporter.failIfPendingErrors(Reporter.java:116)
    at com.android.tools.r8.utils.Reporter.fatalError(Reporter.java:74)
    at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:59)
    ... 10 more

 

根据version-900-rc2,第二条:对所有工件使用Java 8字节码。

 

解决,添加对java8对支持

android {
 
    //指定jdk版本
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

个人微信号:lanjixingxun 

:androidlib:compileDebugJavaWithJavac'. > superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner (in unnamed module @0x27287864) cannot access class com.sun.tools.javac.tree.TreeScanner (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module @0x27287864 * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':androidlib:compileDebugJavaWithJavac'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:145) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:143) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(
最新发布
07-02
<think>我们正在解决一个Android项目构建错误,具体是ButterKnife处理器在访问`com.sun.tools.javac.tree.TreeScanner`时,由于模块权限问题导致的错误。错误信息指出:`jdk.compiler`模块没有将`com.sun.tools.javac.tree`导出给未命名模块(即我们的ButterKnife处理器所在的模块)。根据引用[3]和[4]提供的解决方案,我们可以通过Gradle配置来添加JVM参数,以导出所需的包给未命名模块。具体有两种方法:###方法1:在模块级`build.gradle`中配置Java编译选项在应用程序模块(通常是`app`模块)的`build.gradle`文件中,找到`android`部分,添加以下配置:```groovyandroid {//...其他配置tasks.withType(JavaCompile).configureEach {options.fork= trueoptions.forkOptions.jvmArgs +=['--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED','--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED','--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED']} }``` ###方法2:在`gradle.properties`文件中配置全局JVM参数在项目根目录下的`gradle.properties`文件中,添加以下JVM参数: ```propertiesorg.gradle.jvmargs=-Xmx4096m\ --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\ --add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED```注意:如果之前已经设置了`org.gradle.jvmargs`(例如设置了堆大小),则只需在其后追加`--add-exports`参数,并用反斜杠`\`进行换行(在.properties文件中,反斜杠用于换行)。 ###注意事项1.这些解决方案适用于使用JDK9及以上版本的情况,因为模块系统是从JDK9开始引入的。 2.如果你使用的是较旧版本的ButterKnife,考虑升级到最新版本,因为新版本可能已经修复了此问题。3.如果问题仍然存在,可能需要检查JDK版本和ButterKnife版本的兼容性。 ###替代方案如果上述方法无效,或者你不想修改构建配置,可以考虑以下替代方案: -使用Android官方推荐的ViewBinding替代ButterKnife[^1]。 -或者使用Kotlin的合成视图(但注意在Kotlin1.4.20之后已被废弃)[^2]。 ###总结通过添加JVM参数导出所需的包,可以解决ButterKnife处理器访问`TreeScanner`类时的模块权限问题。建议优先使用方法1,因为它只影响当前模块的编译任务。如果项目中有多个模块使用ButterKnife,则使用方法2全局配置。§§相关问题§§1.如何升级ButterKnife到最新版本? 2.Android项目中如何启用ViewBinding? 3.如何检查项目中使用的JDK版本?</think>### 解决ButterKnife处理器访问TreeScanner的模块导出错误 #### 问题原因分析 该错误发生在使用JDK 9+模块系统时,ButterKnife处理器(位于未命名模块)尝试访问`jdk.compiler`模块内部的`com.sun.tools.javac.tree`包,但该包未导出给未命名模块。核心报错信息: ```log superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner cannot access class com.sun.tools.javac.tree.TreeScanner because module jdk.compiler does not export com.sun.tools.javac.tree to unnamed module ``` #### 解决方案(任选其一) ##### 方案1:在模块级build.gradle中添加JVM参数(推荐) ```gradle android { ... tasks.withType(JavaCompile).configureEach { options.fork = true options.forkOptions.jvmArgs += [ '--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', '--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED' ] } } ``` *效果*:显式导出所需包给所有未命名模块[^3] ##### 方案2:在gradle.properties中全局配置 ```properties org.gradle.jvmargs=-Xmx4096m \ --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ --add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \ --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED ``` *注意*:反斜杠`\`用于属性换行[^4] ##### 方案3:降级JDK版本(临时方案) 使用JDK 8(无模块系统限制),但可能导致兼容性问题 #### 技术原理 JDK 9+的模块系统要求显式导出内部API: $$ \text{导出规则} : \text{module} \xrightarrow{\text{exports}} \text{package} \ \text{to} \ \text{module} $$ 通过`--add-exports`打破模块隔离: $$ \text{jdk.compiler} \xrightarrow{\text{exports}} \text{com.sun.tools.javac.tree} \ \text{to} \ \text{ALL-UNNAMED} $$ #### 验证步骤 1. 执行`./gradlew clean build` 2. 检查ButterKnife注解处理是否通过 3. 确认`TreeScanner`相关错误消失 #### 备选建议 若问题持续: 1. 升级ButterKnife至最新版(可能已修复) 2. 迁移到ViewBinding/Jetpack Compose等官方方案 3. 检查JDK工具链配置: ```gradle android { compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀的沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值