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

如何在Gradle任务中获取产品风味与构建类型以处理生成的APK

在Gradle任务中获取产品风味(product flavor)和构建类型(build type)的方法

我来给你梳理下怎么精准拿到这两个参数,并且正确定位到生成的APK文件,完美适配不同的flavor和buildType组合~

推荐方案:为每个变体创建专属复制任务

Android的每个构建变体(也就是product flavor + build type的组合,比如normalDebug、tinybuildRelease)都会对应一个独立的构建任务。我们可以遍历所有变体,自动为每个变体生成对应的APK复制任务,这样既能拿到flavor和buildType信息,还能保证任务只在对应APK构建完成后执行。

直接上代码,把这段加到你的android代码块里:

android {
    productFlavors {
        normal {}
        tinybuild {}
    }

    // 遍历所有应用变体,生成对应的APK复制任务
    applicationVariants.all { variant ->
        // 获取当前变体的风味名称和构建类型名称
        def flavorName = variant.flavorName
        def buildTypeName = variant.buildType.name
        // 生成清晰的任务名称,比如copyNormalDebugAPK、copyTinybuildReleaseAPK
        def taskName = "copy${flavorName.capitalize()}${buildTypeName.capitalize()}APK"

        task(taskName, type: Exec) {
            // 依赖当前变体的构建任务,确保APK先构建完成再复制
            dependsOn variant.assemble

            // 获取生成的APK的绝对路径,不管flavor和buildType怎么变都能正确找到
            def apkPath = variant.outputs.first().outputFile.absolutePath

            workingDir "$projectDir/.."
            // 把flavor、buildType、APK路径作为参数传给你的Python脚本
            commandLine 'python', 'myscript.py', flavorName, buildTypeName, apkPath
        }
    }
}

关键代码说明

  • applicationVariants.all: 遍历所有的应用构建变体,覆盖你定义的所有flavor和buildType组合
  • variant.flavorName: 直接获取当前变体的产品风味名称(比如normal、tinybuild)
  • variant.buildType.name: 获取当前变体的构建类型名称(比如debug、release)
  • variant.outputs.first().outputFile.absolutePath: 精准定位到当前变体生成的APK文件的绝对路径,不用自己拼接路径
  • dependsOn variant.assemble: 保证复制任务只会在对应的APK构建完成后才执行,避免找不到文件的问题

使用的时候也很方便,比如要复制normalDebug的APK,直接运行:

./gradlew copyNormalDebugAPK

要复制tinybuildRelease的APK就运行:

./gradlew copyTinybuildReleaseAPK

备选方案:针对特定构建类型创建任务

如果你只想处理debug类型的所有flavor,可以单独写一个任务,遍历所有debug变体来处理:

task copyDebugAPK(type: Exec) {
    // 依赖所有debug变体的构建任务,确保所有debug APK都先构建完成
    dependsOn android.applicationVariants.findAll { it.buildType.name == 'debug' }.collect { it.assemble }

    // 在任务执行前获取每个debug变体的信息并处理
    doFirst {
        android.applicationVariants.each { variant ->
            if (variant.buildType.name == 'debug') {
                def flavorName = variant.flavorName
                def apkPath = variant.outputs.first().outputFile.absolutePath
                // 调用你的脚本,传入flavor、buildType和APK路径
                commandLine 'python', 'myscript.py', flavorName, 'debug', apkPath
            }
        }
    }
}

不过这种方式会一次性处理所有debug的APK,灵活性不如第一种方案,还是更推荐为每个变体单独创建任务~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:00:59