如何在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
相关产品推荐
相关产品推荐

