Gradle构建类型相互覆盖

时间:2018-12-05 08:23:53

标签: android gradle build.gradle

我想根据选择的buildType为属性设置不同的值。但是通过检查gradle控制台,我意识到在配置阶段所有3个buildTypes都已执行,并且最后一个build的值保留在属性中。我认为这不是应该的工作方式。 我做错什么了吗?

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
无论我是否调用assembleRelease,assembleDebug,assembleStaging,“ test”属性的

值始终为真

为什么我到处都看到人们在被最后一个重写时将api键,URL和其他自定义内容放到buildType中?我了解gradle可能会在配置阶段调用所有buildtype,但是上面提到的值在哪里呢?

1 个答案:

答案 0 :(得分:1)

如果您想从项目中的源代码中获取test值,则可以设置变量:

buildTypes {
    release {
        buildConfigField 'boolean', 'test', 'false'
    }
    debug {
        buildConfigField 'boolean', 'test', 'false'
    }
    staging {
        buildConfigField 'boolean', 'test', 'true'
    }
}

然后您可以使用BuildConfig类从代码中获取此字段(test字段将生成到BuildConfig中)。通过BuildConfig.test获取它。

如果您真的想更改任何buildType的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
  }
}