鉴于以下配置:
productFlavors {
normal {
applicationId "com.app"
}
mock {
applicationId "com.app.mock"
}
}
buildTypes {
debug {
productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
productFlavors.mock.buildConfigField "boolean", "mockMode", "true"
}
release {
productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
// Release should never point to mocks. Ever.
productFlavors.mock.buildConfigField "boolean", "mockMode", "false"
}
}
我原本期望BuildConfig.mockMode = true;
,但这是生成的构建配置:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "*****";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "mock";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from product flavor: mock
public static final boolean mockMode = false;
}
通过一些调查/调试,我意识到如果我在发行版buildType中更改产品风味的值,它实际上会更新BuildConfig.mockMode
值,尽管已选择mockDebug
作为我的构建变体。
我已经有了一个更好的解决方案来实现我想要做的事情,所以我只是想找一个答案,帮助我理解为什么 Gradle基于配置以这种方式行事,到帮助我更多地了解它正在做什么。
答案 0 :(得分:3)
您可以提取逻辑以决定BuildConfig字段的实际值到它自己的方法中。这样,DSL配置只有一行。它看起来像这样(未经测试 - 期望语法错误):
buildTypes {
applicationVariants.all { variant ->
variant.buildConfigField "boolean", "mockMode", mockMode(variant)
}
}
def mockMode(variant) {
//Return true or false depending on variant.buildType and variant.productFlavors
}
答案 1 :(得分:2)
使用此配置运行后,相当容易理解:
buildTypes {
debug {
println("debug!")
}
release {
println("release!")
}
}
您在构建日志中看到的是:
Information:Gradle tasks [:app:assembleOneDebug]
debug!
release!
:app:preBuild UP-TO-DATE
...
这意味着您的代码的所有4行都被执行,因此唯一有效的行是最后2行:
productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
productFlavors.mock.buildConfigField "boolean", "mockMode", "false"
这导致您的BuildConfig
:
public static final boolean mockMode = false;