Android Studio按Flavor重命名AAB/APK遇版本号错误求解决方案
解决方案
你的问题核心在于:archivesBaseName是全局属性,配置多个Flavor时,后执行的Flavor配置会覆盖之前的设置,导致所有输出文件都使用最后一个Flavor的versionCode(也就是PROD的3)。
推荐使用针对每个构建变体单独配置输出文件名的方式,避免全局属性覆盖问题,同时逻辑更清晰可靠。
步骤1:定义版本映射(替代原静态方法)
用Map存储Flavor与versionCode的对应关系,比静态方法更直观易维护:
// 定义Flavor对应的versionCode def flavorVersionMap = [ "sit": 111, "uat": 2, "prod": 3 ] // 统一版本名称 def appVersionName = "1.1.0" // 项目名称 def projectName = "MyApp"
步骤2:配置Product Flavors的版本信息
在productFlavors中直接引用上面的映射:
productFlavors { sit { versionCode flavorVersionMap["sit"] versionName appVersionName } uat { versionCode flavorVersionMap["uat"] versionName appVersionName } prod { versionCode flavorVersionMap["prod"] versionName appVersionName } }
步骤3:自定义输出文件名
在android闭包中添加变体遍历逻辑,为每个输出文件单独设置名称:
android { // ... 其他已有配置(compileSdk、defaultConfig等) applicationVariants.all { variant -> variant.outputs.each { output -> // 获取当前变体的关键信息 def flavorName = variant.flavorName.toLowerCase() def versionCode = variant.versionCode def versionName = variant.versionName def extension = output.outputFile.extension // 按照目标格式拼接文件名 def outputFileName = "${projectName}_${versionCode}_${versionName}-${flavorName}.${extension}" // 替换输出文件路径与名称 output.outputFile = new File(output.outputFile.parent, outputFileName) } } }
效果验证
构建后会生成符合要求的文件名:
- SIT环境:
MyApp_111_1.1.0-sit.aab/MyApp_111_1.1.0-sit.apk - UAT环境:
MyApp_2_1.1.0-uat.aab/MyApp_2_1.1.0-uat.apk - PROD环境:
MyApp_3_1.1.0-prod.aab/MyApp_3_1.1.0-prod.apk
补充说明
如果版本名称需要动态获取(比如从文件或Git标签),可以把appVersionName改成方法实现,比如:
def fetchVersionName() { // 这里可以添加动态获取逻辑,比如读取gradle.properties或Git标签 return "1.1.0" }
然后在productFlavors中使用versionName fetchVersionName()即可。
内容的提问来源于stack exchange,提问作者KsiAndroid
相关产品推荐
相关产品推荐

