【问题标题】:Gradle buildtypes override each otherGradle 构建类型相互覆盖
【发布时间】:2018-12-05 18:24:02
【问题描述】:

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

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' 属性的值始终为真,无论我调用 assembleRelease、assembleDebug 还是 assembleStaging

为什么我到处都能看到人们将 api 密钥、url 和其他自定义内容放入 buildTypes 中,但最后一个却被最后一个覆盖了?我知道 gradle 可能会在配置阶段调用所有构建类型,但是在哪里放置上面提到的值呢?

【问题讨论】:

    标签: android gradle build.gradle


    【解决方案1】:

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

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

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

    如果你真的想改变任何 buildTypes 的 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
      }
    }
    

    【讨论】:

    • 看起来更像是一种解决方法,而不是想要的实现,但我现在明白了。非常感谢!
    猜你喜欢
    • 2013-07-11
    • 2017-03-23
    • 2020-07-03
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多