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

Android构建报错求助:重复文件与MethodHandle兼容问题

一步步解决你的Android构建错误

我来帮你拆解并解决这三个关联的构建问题,先从根源入手,再给出具体的配置修改方案:

1. 解决MethodHandle.invoke仅支持API26+的限制

你的minSdkVersion是15,而Groovy库(来自io.rest-assured:json-path的依赖)使用了Android 8.0(API26)才原生支持的MethodHandle相关API。要让低版本系统兼容这些Java 8特性,需要启用Desugar工具:

在build.gradle的android块中添加Desugar配置:

android {
    // 保留你已有的其他配置...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // 新增这一行开启Desugar
        coreLibraryDesugaringEnabled true
    }

    // 新增Desugar的依赖
    dependencies {
        coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
    }
}

2. 解决DuplicateRelativeFileException重复文件冲突

多个依赖库都包含了META-INF/groovy-release-info.properties文件,导致打包时冲突。需要在packagingOptions中明确排除这些重复文件,同时可以顺带排除其他可能引发冲突的Groovy相关元文件:

android {
    // 保留你已有的其他配置...
    packagingOptions {
        exclude 'META-INF/groovy-release-info.properties'
        exclude 'META-INF/groovy-release-info.xml'
        exclude 'META-INF/services/org.codehaus.groovy.runtime.ExtensionModule'
    }
}

3. 解决DexArchiveBuilderException无法处理groovy jar的问题

你当前把io.rest-assured:json-path作为implementation依赖引入,这会把Groovy的完整代码打包进主APK,很容易触发Dex编译错误。如果这个库只用于测试代码,建议把它移到testImplementation范围,这样就不会影响主APK的构建:

dependencies {
    // 移除原来的implementation声明
    // implementation 'io.rest-assured:json-path:3.3.0'
    // 改为测试依赖
    testImplementation 'io.rest-assured:json-path:3.3.0'
}

如果确实需要在主代码中使用JSON路径解析,推荐改用纯Java实现的com.jayway.jsonpath:json-path,它不依赖Groovy,不会带来这些兼容性问题:

implementation 'com.jayway.jsonpath:json-path:2.8.0'

修改后的完整build.gradle示例

apply plugin: 'com.android.application'
android {
    compileSdkVersion 27
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        coreLibraryDesugaringEnabled true
    }
    defaultConfig {
        applicationId "com.example.example"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        exclude 'META-INF/groovy-release-info.properties'
        exclude 'META-INF/groovy-release-info.xml'
        exclude 'META-INF/services/org.codehaus.groovy.runtime.ExtensionModule'
    }
    dependencies {
        coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.squareup.okhttp3:okhttp:3.13.0'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.5'
    implementation 'com.fasterxml.jackson.core:jackson-core:2.8.5'
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.5'
    // 移到测试依赖
    testImplementation 'io.rest-assured:json-path:3.3.0'
    testImplementation 'org.mockito:mockito-core:1.10.19'
    testImplementation 'junit:junit:4.12'
    testImplementation 'com.squareup.okhttp3:mockwebserver:3.13.0'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

为什么会出现这些问题?

  • 重复文件冲突:Groovy自身和其他依赖Groovy的库都携带了相同的元信息文件,打包时Gradle无法确定保留哪一个,所以抛出异常。
  • MethodHandle限制:Groovy 2.4+依赖了Java 7的MethodHandle API,而Android直到API26才原生支持,低版本系统需要通过Desugar工具转换字节码来兼容。
  • Dex编译错误:Groovy的字节码结构相对复杂,Dex编译器在处理时容易出错,把依赖限制在测试范围可以避免这个问题,或者改用纯Java的替代库从根源解决。

内容的提问来源于stack exchange,提问作者vauricch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:32:44