You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:35:01