生成Release构建失败::app:packageRelease任务执行出错
问题排查:生成签名APK时的路径创建失败错误
背景修改
为减小应用体积,我们在android/app/build.gradle中做了如下调整:
def enableSeparateBuildPerCPUArchitecture = false => true def enableProguardInReleaseBuilds = false => true
遇到的错误
尝试生成签名APK时,触发以下构建失败:
Execution failed for task ':app:packageRelease'.
A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
java.io.IOException: Failed to create path-project/android/app/build/outputs/apk/release/app1.0.5(65)-release.apk'
已尝试的无效方案
在gradle.properties中添加内存配置,但问题未解决:
org.gradle.jvmargs=-Xmx4608m
相关配置文件内容
android/build.gradle
buildscript { ext { buildToolsVersion = "30.0.2" minSdkVersion = 21 compileSdkVersion = 30 targetSdkVersion = 30 firebaseMessagingVersion = "+" googlePlayServicesVersion = "+" playServicesVersion = "17.0.0" androidMapsUtilsVersion = "2.2.5" } repositories { google() jcenter() } dependencies { classpath("com.android.tools.build:gradle:4.0.1") classpath 'com.google.gms:google-services:4.3.8' } }
android/app/build.gradle
splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } buildTypes { debug { signingConfig signingConfigs.debug } release { signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } applicationVariants.all { variant -> variant.outputs.all { outputFileName = "tcard${variant.versionName}(${variant.versionCode})-${variant.name}.apk" } } } applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for universal variants output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } packagingOptions { pickFirst 'lib/x86/libc++_shared.so' pickFirst 'lib/x86_64/libjsc.so' pickFirst 'lib/arm64-v8a/libjsc.so' pickFirst 'lib/arm64-v8a/libc++_shared.so' pickFirst 'lib/x86_64/libc++_shared.so' pickFirst 'lib/armeabi-v7a/libc++_shared.so' }
原因排查与解决方案
核心原因
- 文件名包含非法字符:错误中的APK文件名带有括号
(),Windows等操作系统不允许文件名包含这类特殊字符,导致Gradle无法创建文件路径。 - ABI拆分导致文件名重复:开启
enableSeparateBuildPerCPUArchitecture=true后会生成多个不同架构的APK,但当前输出文件名未包含ABI标识,会出现重名冲突。 - Gradle配置语法错误:提供的
android/app/build.gradle中,applicationVariants.all块缺少闭合的},导致配置解析异常。
解决方案
修改输出文件名规则
在android/app/build.gradle的buildTypes块中,替换非法字符并添加ABI标识,避免重名:applicationVariants.all { variant -> variant.outputs.all { output -> def abi = output.getFilter(OutputFile.ABI) ?: "universal" outputFileName = "tcard_${variant.versionName}_${variant.versionCode}_${abi}_${variant.name}.apk" } }修复Gradle配置语法
补全applicationVariants.all块的闭合括号: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 = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } } // 补全该闭合括号清理缓存后重新构建
执行命令清理旧构建缓存,再重新生成APK:./gradlew clean ./gradlew assembleRelease检查目录权限
确保项目所在目录拥有读写权限,避免因权限不足导致文件创建失败。
内容的提问来源于stack exchange,提问作者Zero0
相关产品推荐
相关产品推荐

