如何通过自定义Gradle任务批量构建指定变体的APK?
嘿,我刚好有过类似的Gradle批量构建需求,这就给你一个完整的解决方案,完全匹配你提到的所有条件:
完整Gradle自定义任务实现方案
核心思路
我们会创建一个批量任务,先筛选出符合以下条件的变体:
environment维度为productionbrand维度不是nonPublishedBrandbuildType为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 } } }
关键注意事项
- 签名配置:请确保你已经在
android.signingConfigs中配置了release签名信息,否则assembleRelease任务无法生成签名APK。 - Bugsnag插件:需要提前引入Bugsnag的Gradle插件,确保
uploadBugsnagXXXReleaseMapping任务存在(插件会自动为每个Release变体生成该任务)。 - 路径自定义:如果需要修改APK的目标目录,直接修改
targetDir变量的值即可。 - 任务执行:在Android Studio的Gradle面板中,找到
Build分组下的batchBuildProductionReleaseApks任务,点击执行即可;或者在终端运行./gradlew batchBuildProductionReleaseApks。
内容的提问来源于stack exchange,提问作者Davide Casadei
相关产品推荐
相关产品推荐

