特定风味的变体是如何工作的?

How the flavor-specific variants are working?

如果您需要口味,您应该去 build gradle 并添加您需要的口味

像这样

productFlavors {
mock {
  applicationIdSuffix = ".mock"
}
prod {}
}

然后你需要像这样创建相应的目录/src/prod/java/

我认为它应该如何工作,例如根据选择的构建变体 prodDebug androidStudio 将作为基础主要源并根据选择的构建变体从目录中替换相应的 类。

但后来我发现了下面的片段

Files in the flavor-specific folders do not replace files in the main source set. Trying to do that will result in a duplicate class exception. This is a common misconception because it's how resources are merged.

main 源集中的代码将始终进入 APK。只有使用正确的构建变体,其他源集中的源文件才会被合并。例如,您可以创建两个文件:

  • src/mock/java/yourpackage/MyClass.java
  • src/prod/java/yourpackage/MyClass.java

根据您构建的是 prod 还是 mock 变体,其中一个 类 将与 APK 一起编译和打包。同样适用于 debugrelease:您可以拥有仅打包到应用程序的调试或发布版本中的代码和资源。

好的,通过基本的风格配置,你有两种种类的源集:

  1. main 源集
  2. 风味特定 来源集,例如您的 mockprod

使用标准 buildTypes 配置(debugrelease),这将为您提供以下 build variants(构建类型和产品风格的组合):

  1. 模拟调试
  2. 模拟发布
  3. 产品调试
  4. 产品发布

它们中的每一个都使用与 flavor/type 名称 主集相对应的每个源集,例如 prodRelease 将立即使用以下所有源集:

  1. /src/main
  2. /src/prod
  3. /src/release

实际上,构建系统会将所有这些 'merge' 放入一个源集中,这意味着如果这些集中有 class 个具有相同路径和名称的元素,则会发生名称冲突编译器将失败。

正确使用源集的方法是从 main 集中省略每个集需要不同的 class,而是提供它每种口味/每种构建类型的所有集合,例如:

  1. main 集有 class A.java 引用 class B.java。 B.java 从主集中省略。
  2. 不同的 B.java 文件包含在 mockprod 集合中(当然,不需要不同,但需要提供相同的接口,最好是main集合中包含的接口。
  3. 编译器使用当前配置所使用的集合中的 B.java - 构建变体,因此 mockprod 一个。
  4. 耶!现在您有两种功能不同的产品口味。

此行为不限于 classes,您可以使用 flavor 或类型特定的资源、AndroidManifest.xml 文件以及任何可以使用的东西进入源目录。

提示:在 Android Studio 中,您可以在 'project files' 部分看到将选择哪些文件来编译特定变体。要切换构建变体,请按 Cmd+Shift+A(mac 键盘映射)并搜索 Build Variants 短语。它通常也显示在 Android Studio window.

的左下角