如何在Android Gradle的buildTypes配置块中获取versionName
报错原因
versionName是defaultConfig或productFlavor层级的属性,buildType配置块的作用域下没有该属性,直接引用$versionName时Gradle无法在当前上下文找到对应变量,所以抛出未知属性错误。- 如果你需要使用带
versionNameSuffix的最终版本号,buildType配置阶段还没完成版本号的合并计算,此时也拿不到拼接后的完整版本名。
解决方法
方案1:指定作用域引用defaultConfig的versionName
如果你的版本号统一在defaultConfig中配置,直接指定属性所属的作用域即可:
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' versionNameSuffix "-prod" signingConfig signingConfigs.prod archivesBaseName "${defaultConfig.versionName}" } dev { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' versionNameSuffix "-dev" signingConfig signingConfigs.dev archivesBaseName "${defaultConfig.versionName}" } }
如果需要把buildType的后缀也拼到归档名里,直接拼接即可:
archivesBaseName "${defaultConfig.versionName}${versionNameSuffix}"
方案2:通过variant统一配置(适配多flavor场景,更推荐)
如果项目存在多productFlavor,不同flavor有独立的versionName,可以移除buildType中的archivesBaseName配置,在android块外统一通过variant设置:
android { // 原有defaultConfig、buildTypes配置保持不变 } android.applicationVariants.all { variant -> variant.outputs.all { // 直接取合并后的最终versionName,自动包含flavor和buildType的配置 outputFileName = "${variant.versionName}.apk" } }
该方案在Gradle完成构建配置合并的阶段执行,能稳定拿到所有场景下的最终版本号,适配性更强。
方案3:提前声明全局版本号变量
你也可以提前将版本号定义为全局变量,在所有需要的地方统一引用:
// 定义在android块之外 def globalVersionName = "1.0.0" android { defaultConfig { versionName globalVersionName // 其他defaultConfig配置 } buildTypes { release { archivesBaseName "${globalVersionName}" // 其他release配置 } dev { archivesBaseName "${globalVersionName}" // 其他dev配置 } } }
内容的提问来源于stack exchange,提问作者Marian Pavel
相关产品推荐
相关产品推荐

