升级API至34后执行./gradlew bundleRelease报错求解决方案
问题描述
非专业开发者,为家庭使用制作的应用上架Google Play,需将API等级从33升级至34。此前用./gradlew assembleRelease生成APK正常,但执行./gradlew bundleRelease时报错:
BUILD SUCCESSFUL in 6s 75 actionable tasks: 2 executed, 73 up-to-date FAILURE: Build failed with an exception. * Where: Build file '/ssd/chris/AndroidStudioProjects/MyApp/app/build.gradle' line: 183 * What went wrong: Could not determine the dependencies of task ':app:bundleRelease'. > Could not create task ':app:bundleDemoRelease'. > DefaultTaskContainer#register(String, Action) on task set cannot be executed in the current context. * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. BUILD FAILED in 484ms
解决方案
问题出在自定义的AAB重命名任务逻辑上——升级AGP适配API 34后,Gradle不允许在任务配置阶段(tasks.configureEach)注册新任务。按以下步骤修改app/build.gradle:
步骤1:删除旧的自定义任务代码
找到并删除文件末尾从static String firstMatchingSubstring到tasks.configureEach结束的所有代码,这段代码是:
static String firstMatchingSubstring(String taskName, String[] keys) { def lcName = taskName.toLowerCase() for(String key: keys) { if(lcName.contains(key.toLowerCase())) return key } return null } /** * * @param taskName e.g., bundleMyFlavorRelease or bundleRelease * @return */ String getBuildType(String taskName) { return firstMatchingSubstring(taskName, getBuildTypeNames()) } /** * * @param taskName e.g., bundleMyFlavorRelease * @return */ String getFlavor(String taskName) { return firstMatchingSubstring(taskName, getProductFlavorNames()) } String[] getBuildTypeNames() { def types = [] android.buildTypes.configureEach { type -> types.add(type.name) } return types } String[] getProductFlavorNames() { def flavors = [] android.productFlavors.configureEach { flavor -> flavors.add(flavor.name) } return flavors } tasks.configureEach { task -> def name = task.name //Skip some unnecessary tasks if (name.startsWith("bundle") && !name.contains("Classes") && !name.contains("Resources") && name != "bundle") { def renameTaskName = "rename${task.name.capitalize()}Aab" def version = "${android.defaultConfig.versionName}" def flavor = getFlavor(name) def type = getBuildType(name) if(flavor == null || type == null) return def outputName if (flavor == "full") outputName = "MyApp-$version" else outputName = "MyApp-$version-$flavor" tasks.register(renameTaskName) { def path = "${rootDir}/app/${flavor}/${type}/" def originalFile = "$path/app-${flavor}-${type}.aab" doLast { if (file("$originalFile").exists()) { ant.move file: "$originalFile", tofile: "$path/${outputName}.aab" } } } task.finalizedBy(renameTaskName) } }
步骤2:添加新的AAB重命名逻辑
在android代码块的末尾(比如flavorDimensions += 'app'之后)添加以下代码,统一处理APK和AAB的重命名:
applicationVariants.all { variant -> def appName = project.hasProperty("applicationName") ? applicationName : parent.name def version = variant.versionName def flavorName = variant.flavorName def buildTypeName = variant.buildType.name // 保留原有的APK重命名逻辑 variant.outputs.all { output -> outputFileName = "${appName}-${version}.apk" } // 新增AAB重命名逻辑 def bundleTask = tasks.named("bundle${variant.name.capitalize()}") bundleTask.configure { it.doLast { def outputDir = it.outputs.files.singleFile def originalAab = file("${outputDir}/app-${flavorName}-${buildTypeName}.aab") if (originalAab.exists()) { def newAabName = flavorName == "full" ? "MyApp-${version}.aab" : "MyApp-${version}-${flavorName}.aab" ant.move file: originalAab, tofile: file("${outputDir}/${newAabName}") } } } }
注意:如果原来的APK重命名代码在
buildTypes.release块里,可以删除那部分内容,用上面的代码替代,避免重复。
步骤3:执行打包命令
保存修改后的build.gradle,执行命令:
./gradlew bundleRelease
此时应该能正常生成重命名后的AAB文件,路径在app/build/outputs/bundle/release/(对应full flavor)和app/build/outputs/bundle/demorelease/(对应demo flavor)。
内容的提问来源于stack exchange,提问作者Chris972
相关产品推荐
相关产品推荐

