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

Android App Bundle构建失败:第三方Jar库引发res保留名称冲突

解决App Bundle打包时第三方Jar含保留目录res的冲突问题

这个错误的根源很明确:App Bundle的bundletool校验逻辑不允许模块根目录下出现res这个保留名称的目录,而你依赖的第三方Jar包里恰好包含了root/res/drawable/adoceansdk_close_interstitial_button.png这样的文件,触发了校验失败。

下面是几种不用移除第三方库就能解决的方法,按推荐优先级排序:

方法1:用Gradle打包规则重命名冲突路径

这是最简单的方案,通过配置Gradle的packagingOptions,把Jar包里的冲突路径修正为Android标准的资源路径。

Groovy 语法(build.gradle)

android {
    // 保留你原有的其他配置
    packagingOptions {
        // 将Jar中root/res/开头的路径,去掉root/前缀,转为标准资源路径
        rename 'root/res/(.*)', '$1'
        // 确保如果有重复文件时优先使用修正后的版本
        pickFirst 'res/drawable/adoceansdk_close_interstitial_button.png'
    }
}

Kotlin DSL 语法(build.gradle.kts)

android {
    // 保留你原有的其他配置
    packagingOptions {
        rename("root/res/(.*)", "$1")
        pickFirst("res/drawable/adoceansdk_close_interstitial_button.png")
    }
}

配置完成后重新执行打包命令,bundletool就会识别修正后的路径为合法的资源文件,不再报错。

方法2:提取冲突资源到本地,排除Jar中的对应文件

如果方法1不生效,你可以手动处理冲突文件:

  1. 解压第三方Jar包,找到root/res/drawable/adoceansdk_close_interstitial_button.png文件
  2. 将这个文件复制到你自己项目的src/main/res/drawable/目录下(根据分辨率需求放到对应的drawable子目录也可以)
  3. 在Gradle中配置排除Jar里的冲突文件:

Groovy 语法

android {
    packagingOptions {
        // 排除Jar中的冲突文件
        exclude 'root/res/drawable/adoceansdk_close_interstitial_button.png'
    }
}

dependencies {
    // 保留原有的第三方依赖,同时排除冲突文件
    implementation('com.your.lib:third-party-sdk:x.y.z') {
        exclude file: 'root/res/drawable/adoceansdk_close_interstitial_button.png'
    }
}

Kotlin DSL 语法

android {
    packagingOptions {
        exclude("root/res/drawable/adoceansdk_close_interstitial_button.png")
    }
}

dependencies {
    implementation("com.your.lib:third-party-sdk:x.y.z") {
        exclude(file = "root/res/drawable/adoceansdk_close_interstitial_button.png")
    }
}

这样打包时会使用你本地项目中的资源文件,忽略Jar里的冲突路径。

方法3:自定义Gradle任务修复第三方Jar

如果上面两种方法都无法解决,可以写一个Gradle任务,在构建前自动修改第三方Jar的结构:

Groovy 语法

// 创建修复Jar的任务
task fixThirdPartyJar(type: Jar) {
    // 替换成你的第三方Jar路径,比如本地libs目录或Maven仓库路径
    def originalJar = file('libs/third-party-sdk.jar')
    from zipTree(originalJar)

    // 修正路径:移除root前缀
    eachFile { file ->
        if (file.path.startsWith('root/res/')) {
            file.path = file.path.substring(5) // 去掉"root/"
        }
    }

    // 输出修复后的Jar到临时目录
    destinationDir file("$buildDir/tmp/fixed-jars")
    archiveFileName = originalJar.name
}

// 让构建任务先执行修复Jar的操作
preBuild.dependsOn fixThirdPartyJar

// 依赖修复后的Jar
dependencies {
    implementation files("$buildDir/tmp/fixed-jars/third-party-sdk.jar")
}

这个任务会重新打包第三方Jar,修正冲突的路径后再作为依赖使用。

完成配置后,重新执行你的打包命令:

./gradlew app:packageProductionReleaseBundle --stacktrace

应该就能顺利完成打包了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:12