Android Gradle构建类型相互覆盖
我想根据选择的buildType为属性设置不同的值。但通过检查gradle控制台,我意识到在配置阶段,所有3个构建类型都将执行,最后一个构建的值仍保留在属性中。我想这不是它应该做的。 我做错什么了吗Android Gradle构建类型相互覆盖,android,gradle,build.gradle,Android,Gradle,Build.gradle,我想根据选择的buildType为属性设置不同的值。但通过检查gradle控制台,我意识到在配置阶段,所有3个构建类型都将执行,最后一个构建的值仍保留在属性中。我想这不是它应该做的。 我做错什么了吗 android { signingConfigs { ... } compileSdkVersion 28 defaultConfig { ... } productFlavors { normal {
android {
signingConfigs {
...
}
compileSdkVersion 28
defaultConfig {
...
}
productFlavors {
normal {
manifestPlaceholders = [appName: "@string/app_name"]
signingConfig signingConfigs.configNormalRelease
}
}
buildTypes {
release {
println("app release build")
rootProject.ext.test = false
}
debug {
println("app debug build")
rootProject.ext.test = false
}
staging {
println("app staging build")
rootProject.ext.test = true
}
}
sourceSets {
main {
aidl.srcDirs = ['src/main/aidl']
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
checkReleaseBuilds true
abortOnError false
}
flavorDimensions 'tier'
productFlavors {
normal {
dimension "tier"
}
}
}
输出为
app release build
app debug build
app staging build
“test”属性的值始终为true,无论我调用assembleRelease、assembleDebug还是assembleStaging
为什么我到处都能看到人们在被上一个构建类型覆盖时将api键、URL和其他自定义内容放入到构建类型中?我知道gradle可能会在配置阶段调用所有buildtypes,但上面提到的值放在哪里?如果您想从项目中的源代码中获取
测试值,可以设置变量:
buildTypes {
release {
buildConfigField 'boolean', 'test', 'false'
}
debug {
buildConfigField 'boolean', 'test', 'false'
}
staging {
buildConfigField 'boolean', 'test', 'true'
}
}
然后您可以使用BuildConfig
类从代码中获取此字段(test
字段将生成到BuildConfig
)。通过BuildConfig.test
获取它
如果您确实想更改任何构建类型的gradle变量,可以尝试执行以下操作:
android.applicationVariants.all { variant ->
boolean isStaging = gradle.startParameter.taskNames.find {it.contains("staging") || it.contains("Staging")} != null
if (isStaging) {
rootProject.ext.test = true
} else {
rootProject.ext.test = false
}
}
看起来更像是一个解决方案,而不是想要的实现,但我现在明白了。非常感谢你!