产品口味和来源层次结构

Product flavors and source hierarchies

我的应用有两种风格,为简单起见,将其称为 flavoraflavorb

    productFlavors {
        flavora {
            resValue "string", 'app_name', "App Name Flavor A"
            applicationIdSuffix ".flavora"
        }
        flavorb {
            resValue "string", 'app_name', "App Name Flavor B"
            applicationIdSuffix ".flavorb"
        }
    }

我希望两种风格都使用所有相同的布局、所有相同的 java 代码、所有相同的资源等等,除了我希望 flavoraflavorb 使用不同的布局文件 flavor_dependent_layout.xml 和 Java class FlavorDependentJavaClass.

的实现

这是正确的做法吗:

sourceSets {
    main {
        res.srcDirs = ['src/main/res']
        java.srcDirs = ['src/main/java']
    }
    flavora {
        res.srcDirs = ['src/flavora/res', 'src/main/res']
        java.srcDirs = ['src/flavora/java', 'src/main/java']
    }
    flavorb {
        res.srcDirs = ['src/flavorb/res', 'src/main/res']
        java.srcDirs = ['src/flavorb/java', 'src/main/java']
    }
}

然后我只需要创建必要的文件夹来放置相应的文件,就可以自然地从那里开始工作了?例如,它怎么知道我已经为两种口味都包含了 class,以防万一我尝试执行一种方法而它只针对一种口味存在?

(此外,我是否必须明确提及资产文件夹?因为我也有“/src/main/assets”)

Is this the correct way to do it:

没有

只需创建 src/flavora/res/src/flavora/java/src/flavorb/res/src/flavorb/java/,然后将内容放入其中。它们将自动 添加到适当的构建路径中。您不需要调整 srcDirs.

How does it know that I've included the class for both flavors in case I try to perform a method and it only exists for one flavor, for example?

这是一个构建错误。使用 Java 代码,如果你想在 flavors 中使用它:

  • 相同的class不能存在于main
  • main 中引用的任何内容必须同时存在于 flavoraflavorb

因此,例如,如果您在 src/flavora/java/ 内某处和 src/flavorb/java/ 内某处有一个 AdStrategy class,您就不会 src/main/java/ 中有 AdStrategymainAdStrategy 上引用的任何内容(构造函数、方法等)都必须存在于 flavoraflavorbAdStrategy 的实现中。在构建时,当您构建 flavora 时,会自动使用 src/main/java/src/flavora/java/ 树,并且您在 main 中引用的任何内容都需要解析(对于 flavorb 建造)。