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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:08:08