生成签名Bundle时遇PackageBundleTask执行错误求助
Android Bundle Build Error: File uses reserved name 'res'
问题描述
生成签名Android App Bundle时触发以下错误:
* What went wrong: Execution failed for task ':app:packageReleaseBundle'. > A failure occurred while executing com.android.build.gradle.internal.tasks.PackageBundleTask$BundleToolWorkAction > File 'root/res/anim/accelerate_decelerate_interpolator.xml' uses reserved file or directory name 'res'.
尝试过在configurations和packagingOptions中添加排除规则,但问题未解决,项目build.gradle配置如下:
apply plugin: "com.android.application" import com.android.build.OutputFile import org.apache.tools.ant.taskdefs.condition.Os project.ext.react = [ enableHermes: true, // clean and rebuild if changing ] apply from: "../../node_modules/react-native/react.gradle" def enableSeparateBuildPerCPUArchitecture = false def enableProguardInReleaseBuilds = false def jscFlavor = 'org.webkit:android-jsc:+' def enableHermes = project.ext.react.get("enableHermes", false); def reactNativeArchitectures() { def value = project.getProperties().get("reactNativeArchitectures") return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] } android { configurations { compile.exclude group: 'com.google.android' compile.exclude group: 'root/res/anim/accelerate_decelerate_interpolator.xml' } packagingOptions { exclude 'AndroidManifest.xml' exclude 'resources.arsc' exclude 'root/res/anim/accelerate_decelerate_interpolator.xml' } ndkVersion rootProject.ext.ndkVersion compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { applicationId "com.proaction_member_app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() if (isNewArchitectureEnabled()) { externalNativeBuild { cmake { arguments "-DPROJECT_BUILD_DIR=$buildDir", "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid", "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build", "-DNODE_MODULES_DIR=$rootDir/../node_modules", "-DANDROID_STL=c++_shared" } } if (!enableSeparateBuildPerCPUArchitecture) { ndk { abiFilters (*reactNativeArchitectures()) } } } } if (isNewArchitectureEnabled()) { externalNativeBuild { cmake { path "$projectDir/src/main/jni/CMakeLists.txt" } } def reactAndroidProjectDir = project(':ReactAndroid').projectDir def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) { dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck") from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") into("$buildDir/react-ndk/exported") } def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) { dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck") from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") into("$buildDir/react-ndk/exported") } afterEvaluate { preDebugBuild.dependsOn(packageReactNdkDebugLibs) preReleaseBuild.dependsOn(packageReactNdkReleaseLibs) configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild) configureCMakeDebug.dependsOn(preDebugBuild) reactNativeArchitectures().each { architecture -> tasks.findByName("configureCMakeDebug[${architecture}]")?.configure { dependsOn("preDebugBuild") } tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure { dependsOn("preReleaseBuild") } } } } splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false include (*reactNativeArchitectures()) } } signingConfigs { debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } release { storeFile file('proaction_member_app.keystore') storePassword 'ProactionMemberApp' keyAlias 'proaction_member_app' keyPassword 'ProactionMemberApp' } } buildTypes { debug { signingConfig signingConfigs.debug } release { signingConfig signingConfigs.release minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } applicationVariants.all { variant -> variant.outputs.each { output -> def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { output.versionCodeOverride = defaultConfig.versionCode * 1000 + versionCodes.get(abi) } } } } apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "com.facebook.react:react-native:+" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { exclude group:'com.facebook.fbjni' } debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { exclude group:'com.facebook.flipper' exclude group:'com.squareup.okhttp3', module:'okhttp' } debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { exclude group:'com.facebook.flipper' } if (enableHermes) { implementation("com.facebook.react:hermes-engine:+") { exclude group:'com.facebook.fbjni' } } else { implementation jscFlavor } implementation 'tech.bubbl:bubbl-sdk:1.6.17' implementation 'tech.bubbl.sdk.android.googlelibs:youtube-player:1.0.3' implementation 'com.squareup.okhttp3:okhttp:4.9.1' implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' implementation "com.google.android.gms:play-services-location:16.0.0" implementation "com.google.android.gms:play-services-maps:16.0.0" implementation "com.google.android.gms:play-services-places:16.0.0" implementation "com.google.android.exoplayer:exoplayer-core:2.18.1" implementation "com.google.android.exoplayer:exoplayer-dash:2.18.1" implementation "com.google.android.exoplayer:exoplayer-hls:2.18.1" implementation "com.google.android.exoplayer:exoplayer-ui:2.18.1" implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:2.18.1" implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.google.android.material:material:1.7.0' implementation "com.google.android.gms:play-services-location:16.0.0" implementation "com.google.android.gms:play-services-maps:16.0.0" implementation "com.google.android.gms:play-services-places:16.0.0" implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.squareup.retrofit2:retrofit:2.0.2' implementation 'com.squareup.retrofit2:converter-gson:2.0.2' implementation 'com.lukekorth:mailable_log:0.1.6' implementation 'com.dreizak:miniball:1.0.3' implementation 'com.google.firebase:firebase-messaging:21.1.0' implementation 'com.google.firebase:firebase-core:21.1.1' implementation 'com.google.firebase:firebase-crash:16.2.1' implementation 'com.google.firebase:firebase-auth:21.1.0' } if (isNewArchitectureEnabled()) { configurations.all { resolutionStrategy.dependencySubstitution { substitute(module("com.facebook.react:react-native")) .using(project(":ReactAndroid")) .because("On New Architecture we're building React Native from source") substitute(module("com.facebook.react:hermes-engine")) .using(project(":ReactAndroid:hermes-engine")) .because("On New Architecture we're building Hermes from source") } } } task copyDownloadableDepsToLibs(type: Copy) { from configurations.implementation into 'libs' } apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) def isNewArchitectureEnabled() { return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" }
问题原因
错误源于某个依赖库打包不规范:将Android标准资源目录res放在了包的根目录下,而Bundle工具禁止根目录使用res这个保留名称。你之前尝试的configurations.exclude是针对依赖组的规则,无法作用于文件路径;packagingOptions的路径匹配范围也不够,导致排除失效。
解决步骤
1. 定位违规依赖
运行Gradle命令生成依赖树,找出引入错误文件的库:
./gradlew app:dependencies
重点排查第三方SDK(比如tech.bubbl:bubbl-sdk:1.6.17或关联的youtube-player库),这类非官方SDK容易出现打包错误。
2. 修正Packaging Options
在android块中更新packagingOptions,用通配符覆盖所有根目录下的res相关文件,同时移除无效的configurations规则:
android { configurations { compile.exclude group: 'com.google.android' // 删除无效的文件路径排除规则 // compile.exclude group: 'root/res/anim/accelerate_decelerate_interpolator.xml' } packagingOptions { exclude '**/root/res/**' exclude 'AndroidManifest.xml' exclude 'resources.arsc' } }
3. 升级或替换违规依赖
如果定位到具体依赖,尝试升级到最新版本(通常官方会修复这类打包问题),比如检查bubbl-sdk是否有高于1.6.17的版本,替换后重新构建。
4. 清理缓存并重新构建
执行清理命令清除旧缓存:
./gradlew clean
然后重新生成签名Bundle:
./gradlew bundleRelease
内容的提问来源于stack exchange,提问作者Jack Wright
相关产品推荐
相关产品推荐

