我们的应用程序有免费和付费版本。我们还制作品牌版本,这意味着应用程序在两个方面有所不同。
四个版本可能是:
我现在的解决方案是拥有两种构建类型,付费和免费:
buildTypes {
paid {
packageNameSuffix ".paid"
}
free {
packageNameSuffix ".free"
}
}
还有两种口味:
productFlavors{
nike{
packageName "com.example.theapp.nike"
}
adidas{
packageName "com.example.theapp.adidas"
}
}
应用程序的每个免费版本都使我们成为内容提供者,内容提供者,特定于每个风味 - 构建类型组合。问题是我不知道在哪里放置基于构建变体的源文件。放入 / src / nike 或 / src / free 的源文件将根据构建类型或风格获取。但是依赖于构建变体(类型和风格的组合)的源文件怎么样?
答案 0 :(得分:7)
您可以在src下为您拥有的每个构建或品味创建一个新文件夹。即:'免费','付费','耐克','阿迪达斯'。
在构建时,您放入任何这些文件夹中的文件会根据类型进行拾取并构建两者。
根据Android工具项目网站上的Gradle Plugin User Guide:
与Build Types类似,Product Flavors也提供代码和 资源通过他们自己的sourceSets。
和
在处理所有使用的源集时,使用以下规则 建立一个单一的APK:
- 所有源代码(src / * / java)一起用作生成单个输出的多个文件夹。
- 清单全部合并为一个清单。这允许产品口味具有不同的组分和/或 权限,类似于构建类型。
- 使用覆盖优先级使用所有资源(Android res和资源),其中Build Type会覆盖Product Flavor, 覆盖主要的sourceSet 。
- 每个Build Variant都会从资源中生成自己的R类(或其他生成的源代码)。什么都没有共享 变体。
意味着你的buildType“free”的java文件会覆盖你的风格“nike”,如果它们具有相同的名称。
但是如果您要向清单添加内容,根据上面列表中的第二点,最终清单将是所有清单的合并。
如果您需要更多自定义,可以将文件放入构建变体的文件夹“src / freeNike /".
答案 1 :(得分:2)
由于叠加规则,我的构建类型覆盖了各种类型的问题。
我最终将构建类型源集重定向到不同的文件夹,具体取决于构建的风格。
android.applicationVariants.all { variant ->
switch (variant.name) {
case "FreeNike":
variant.mergeResources.doFirst {
android.sourceSets.free.setRoot("src/freeNike")
}
break;
case "FreeAdidas":
variant.mergeResources.doFirst {
android.sourceSets.free.setRoot("src/freeAdidas")
}
break;
case "PaidNike":
variant.mergeResources.doFirst {
android.sourceSets.paid.setRoot("src/paidNike")
}
break;
case "PaidAdidas":
variant.mergeResources.doFirst {
android.sourceSets.paid.setRoot("src/paidAdidas")
}
break;
}
}
您当然可以自由使用其他文件夹结构。请参阅此处的示例:Folder naming convention for gradle build variants
答案 2 :(得分:1)
查看最新的Gradle插件,它现在允许具有变体特定资源 http://tools.android.com/tech-docs/new-build-system
这里有你的使用范例 https://android.googlesource.com/platform/tools/build/+/master/tests/overlay3/
答案 3 :(得分:0)
您是否尝试将srcDir放入sourceSets? 像这样:
sourceSets {
main {
java {
srcDirs 'src/java'
}
}
}
那应该输出一个带有两个源代码的javaResources,nike和adidas。