Gradle buildType/productFlavor使用意外的buildConfigField

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基于配置以这种方式行事,以帮助我理解它正在做的更多.

Sim*_*mas 2

使用此配置运行后就很容易理解:

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)