运行androidConnectedTest时遇「Couldn't desugar invokedynamic」问题求助
解决Android Instrumented测试中Lambda表达式的Desugar错误
我之前在跑./gradlew connectedAndroidTest时也遇到过一模一样的问题!本质原因是Instrumented测试环境没有正确配置Java 8 Desugar支持,导致Lambda表达式的invokedynamic指令无法被处理。下面是我亲测有效的解决方案:
1. 确保Android Gradle插件版本达标
首先检查项目根目录下的build.gradle,确保Android Gradle插件版本至少在3.0.0以上(推荐使用7.x及以上的稳定版本):
buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.4.2' // 可替换为最新稳定版 } }
2. 配置模块级build.gradle的Java 8支持
在你的myModule的build.gradle文件中,添加完整的Java 8编译配置,重点要给测试环境也开启Desugar:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 coreLibraryDesugaringEnabled true // 启用核心库Desugar转换 } // 给Instrumented测试单独配置Java 8支持 testOptions { testCompileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 coreLibraryDesugaringEnabled true } } }
3. 添加Desugar核心库依赖
在模块的dependencies块中,引入Desugar的核心库依赖:
dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' // 使用最新稳定版 // 你的其他项目依赖... }
4. 清理缓存并重新运行测试
执行以下命令清理Gradle缓存,避免旧的编译产物干扰:
./gradlew clean
然后重新运行Instrumented测试:
./gradlew connectedAndroidTest
额外注意:如果使用Mockito等测试框架
如果你的测试中用到了Mockito,可能还需要添加mockito-inline依赖来支持Java 8的Lambda表达式:
androidTestImplementation 'org.mockito:mockito-inline:4.11.0'
为什么会出现这个错误?
普通的应用构建和单元测试可能已经配置了Java 8支持,但Instrumented测试是运行在真实设备或模拟器上的,这些设备的系统可能不原生支持Java 8的invokedynamic指令(Lambda表达式底层依赖这个指令)。Desugar工具会把这些Java 8特性转换成兼容旧Android版本的字节码,但如果测试环境没开启Desugar,就会触发这个报错。
内容的提问来源于stack exchange,提问作者ADev
相关产品推荐
相关产品推荐

