Ben*_*son 12 groovy android gradle
鉴于以下配置:
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"
}
}
Run Code Online (Sandbox Code Playgroud)

我原以为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;
}
Run Code Online (Sandbox Code Playgroud)
通过一些调查/调试,我意识到如果我在发布版本中更改产品风味的BuildConfig.mockMode值,它实际上会更新该值,尽管已mockDebug选择作为我的构建变体.
我已经有了一个更好的解决方案来实现我想要做的事情,所以我只是想找到一个答案,帮助我理解为什么 Gradle基于配置以这种方式行事,以帮助我理解它正在做的更多.
使用此配置运行后就很容易理解:
buildTypes {
debug {
println("debug!")
}
release {
println("release!")
}
}
Run Code Online (Sandbox Code Playgroud)
您将在构建日志中看到的是:
Information:Gradle tasks [:app:assembleOneDebug]
debug!
release!
:app:preBuild UP-TO-DATE
...
Run Code Online (Sandbox Code Playgroud)
这意味着代码的所有 4 行都被执行,因此唯一有效的行是最后 2 行:
productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
productFlavors.mock.buildConfigField "boolean", "mockMode", "false"
Run Code Online (Sandbox Code Playgroud)
这导致你BuildConfig有:
public static final boolean mockMode = false;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1280 次 |
| 最近记录: |