Android:如何根据buildConfigField值生成对应outputFileName
解决Android Gradle根据buildConfigField值设置输出文件名的问题
原代码的核心问题
- 错误使用复数形式的
variant.buildTypes,应该用单数variant.buildType(每个变体仅对应一个构建类型) buildConfigFields取出的value是字符串类型(如"true"),无法直接做布尔判断,需先转换为布尔值outputFileName无需创建File对象,直接赋值字符串即可applicationVariants.all代码块嵌套在buildTypes内部,会导致编译逻辑冲突
修正后的完整代码
buildTypes { release { buildConfigField "boolean", "NO_BLUETOOTH_CHECK", "true" buildConfigField "String", "SFTP_USERNAME", '""' buildConfigField "String", "SFTP_PASSWORD", '""' signingConfig signingConfigs.release } debug { buildConfigField "boolean", "NO_BLUETOOTH_CHECK", "true" buildConfigField "String", "SFTP_USERNAME", '"******"' buildConfigField "String", "SFTP_PASSWORD", '"******"' signingConfig signingConfigs.debug } } // 必须将变体配置放在buildTypes块外部 applicationVariants.all { variant -> variant.outputs.all { output -> // 将字符串形式的配置值转为布尔类型 def noBluetoothCheck = variant.buildType.buildConfigFields["NO_BLUETOOTH_CHECK"].value.toBoolean() def BTValue = noBluetoothCheck ? "BTOff" : "BTOn" def buildTypeSuffix = variant.buildType.name == 'release' ? 'r' : 'd' // 直接赋值字符串作为输出文件名 outputFileName = "${rootProject.name}_${BTValue}_${buildTypeSuffix}_${variant.versionName}_v${variant.versionCode}.apk" } }
关键修正说明
- 构建类型访问修正:用
variant.buildType替代variant.buildTypes,准确获取当前变体对应的构建类型配置 - 布尔值转换:通过
toBoolean()将字符串形式的"true"/"false"转为真正的布尔值,避免字符串非空即真的判断错误 - 文件名赋值简化:直接使用字符串赋值给
outputFileName,符合Gradle的API要求 - 代码块位置调整:将
applicationVariants.all移到buildTypes外部,避免闭包嵌套导致的编译上下文错误
内容的提问来源于stack exchange,提问作者Yaegaki2
相关产品推荐
相关产品推荐

