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

如何通过自定义Gradle任务批量构建指定变体的APK?

嘿,我刚好有过类似的Gradle批量构建需求,这就给你一个完整的解决方案,完全匹配你提到的所有条件:

完整Gradle自定义任务实现方案

核心思路

我们会创建一个批量任务,先筛选出符合以下条件的变体:

  • environment维度为production
  • brand维度不是nonPublishedBrand
  • buildType为release

然后对每个符合条件的变体,依次执行:生成签名APK → 上传ProGuard映射到Bugsnag → 重命名并移动APK到指定公共目录。


代码实现(Groovy版,适用于大多数Android项目)

把这段代码添加到你的app/build.gradle文件中:

android {
    // 这里假设你已经配置了flavor维度和对应的productFlavors,比如:
    flavorDimensions "environment", "brand"
    productFlavors {
        production {
            dimension "environment"
            // 你的生产环境配置,比如applicationIdSuffix、versionCode等
        }
        // 其他environment flavor(如staging)可以保留,不影响筛选
        staging {
            dimension "environment"
        }

        brandA {
            dimension "brand"
        }
        brandB {
            dimension "brand"
        }
        nonPublishedBrand {
            dimension "brand"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 务必提前配置好release签名信息,否则无法生成签名APK
            signingConfig signingConfigs.release
        }
    }
}

// 1. 定义批量任务的基础配置
def batchBuildTask = tasks.register("batchBuildProductionReleaseApks") {
    group = "Build" // 把任务放到Gradle的Build分组下,方便在AS的Gradle面板找到
    description = "批量构建生产环境Release APK:筛选合规变体、生成签名包、上传Bugsnag映射、整理文件"
}

// 2. 遍历所有变体,筛选符合条件的并绑定任务
android.applicationVariants.all { variant ->
    // 检查三个筛选条件
    boolean isProductionEnv = variant.productFlavors.any { it.dimension == "environment" && it.name == "production" }
    boolean isAllowedBrand = variant.productFlavors.any { it.dimension == "brand" && it.name != "nonPublishedBrand" }
    boolean isReleaseBuild = variant.buildType.name == "release"

    if (isProductionEnv && isAllowedBrand && isReleaseBuild) {
        // 获取当前变体的assemble任务(生成签名APK)
        def assembleTask = tasks.named("assemble${variant.name.capitalize()}")
        // 获取Bugsnag的映射文件上传任务(注意任务名格式要和插件生成的一致)
        def uploadBugsnagTask = tasks.named("uploadBugsnag${variant.name.capitalize()}ReleaseMapping")

        // 3. 创建针对当前变体的APK重命名移动任务
        def processApkTask = tasks.register("process${variant.name.capitalize()}Apk", Copy) {
            // 先确保APK生成和Bugsnag上传完成
            dependsOn assembleTask, uploadBugsnagTask

            // 源文件:当前变体生成的签名APK
            from variant.outputs.first().outputFile
            // 目标目录:项目根目录下的build/outputs/batch-apks(可自行修改路径)
            def targetDir = file("$rootProject.projectDir/build/outputs/batch-apks")
            into targetDir

            // 重命名规则:<brand>-<version>.apk
            def brandName = variant.productFlavors.find { it.dimension == "brand" }.name
            def versionName = variant.versionName
            rename { originalFileName ->
                "${brandName}-${versionName}.apk"
            }

            // 执行前确保目标目录存在
            doFirst {
                targetDir.mkdirs()
            }
        }

        // 4. 将当前变体的处理任务添加到批量任务的依赖链中
        batchBuildTask.configure {
            dependsOn processApkTask
        }
    }
}

关键注意事项

  1. 签名配置:请确保你已经在android.signingConfigs中配置了release签名信息,否则assembleRelease任务无法生成签名APK。
  2. Bugsnag插件:需要提前引入Bugsnag的Gradle插件,确保uploadBugsnagXXXReleaseMapping任务存在(插件会自动为每个Release变体生成该任务)。
  3. 路径自定义:如果需要修改APK的目标目录,直接修改targetDir变量的值即可。
  4. 任务执行:在Android Studio的Gradle面板中,找到Build分组下的batchBuildProductionReleaseApks任务,点击执行即可;或者在终端运行./gradlew batchBuildProductionReleaseApks。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:49:45