我正在使用 Android Studio(v 2.1,gradle 插件 v 2.1.0)开发一个 Android 应用程序。我的应用程序有多个版本,它们共享很多通用代码,因此我决定使用 flavor 维度和产品 flavor 来在需要的时间和地点自定义代码和资源。只要我只有两个 flavor 维度,这就可以正常工作。例如,我的 app.gradle 是
…
flavorDimensions "fruit", "color"
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
}
…
我的 src 文件夹是
src/
appleRed/
appleYellow/
pearRed/
pearYellow/
每个都有我的代码的自定义版本。再举个例子
src/
appleRed/java/com/example/ExampleFragment.java
appleYellow/java/com/example/ExampleFragment.java
pearRed/java/com/example/ExampleFragment.java
pearYellow/java/com/example/ExampleFragment.java
当然,src/main中没有ExampleFragment的实例。
在开发过程中的某个时刻,我必须包含该应用程序的免费 和付费 版本。我认为可以通过添加名为 version 的新 flavor 维度和名为 free 和 paid 的两种产品 flavor 来轻松实现:
…
flavorDimensions "fruit", "color”, “version”
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
free {
dimension "version"
}
paid {
dimension “version”
}
}
…
但突然间,Android Studio 不再检测到由 fruit 和 color 组合生成的自定义代码。所以 appleRed、appleYellow、pearRed 和 pearYellow 都不能用于自定义代码,这是我唯一的方法能够重新获得我的配置是使用所有三个 flavor 维度的所有组合:
src/
appleRedFree/java/com/example/ExampleFragment.java
appleRedPaid/java/com/example/ExampleFragment.java
appleYellowFree/java/com/example/ExampleFragment.java
appleYellowPaid/java/com/example/ExampleFragment.java
pearRedFree/java/com/example/ExampleFragment.java
pearRedPaid/java/com/example/ExampleFragment.java
pearYellowFree/java/com/example/ExampleFragment.java
pearYellowPaid/java/com/example/ExampleFragment.java
这不好,因为 ExampleFragment 在相同的 fruitColor* 组合中重复(appleRedFree、appleRedPaid 有相同的 ExampleFragment)。资源(res 文件夹中的资源)也会出现同样的问题。
我的问题是:
1) 这是 Android Studio 中 gradle 的预期行为吗(即,当具有两种以上口味时,无法组合产品口味的子集,根据其维度遵循它们的优先级尺寸)?
2) 考虑到这是预期的行为,是否有另一种方法可以实现我的自定义,而无需重复代码或无需内部包含 if 语句 的单个文件 (例如,if (BuildConfig.FLAVOR_version == "free") ...)?
请注意,我说的是拥有可能很复杂的自定义代码,所以我并不是在要求基本的自定义,例如构建配置变量、变体过滤或类似的东西。
最佳答案
您想为某些口味使用相同的额外源目录;
appleRedFree + appleRedPaid --> src/appleRed
pearRedFree + pearRedPaid --> src/pearRed
appleYellowFree + appleYellowPaid --> src/appleYellow
pearYellowFree + pearYellowPaid --> src/pearYellow
你可以设置sourceSet适合您的口味:
android {
// Other stuff here
flavorDimensions "fruit", "color”, “version”
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
free {
dimension "version"
}
paid {
dimension “version”
}
}
sourceSets {
appleRedFree {
java.srcDirs = ['src/main/java', 'src/appleRed/java']
}
appleRedPaid {
java.srcDirs = ['src/main/java', 'src/appleRed/java']
}
appleYellowFree {
java.srcDirs = ['src/main/java', 'src/appleYellow/java']
}
appleYellowPaid {
java.srcDirs = ['src/main/java', 'src/appleYellow/java']
}
pearRedFree {
java.srcDirs = ['src/main/java', 'src/pearRed/java']
}
pearRedPaid {
java.srcDirs = ['src/main/java', 'src/pearRed/java']
}
pearYellowFree {
java.srcDirs = ['src/main/java', 'src/pearYellow/java']
}
pearYellowPaid {
java.srcDirs = ['src/main/java', 'src/pearYellow/java']
}
}
// Other stuff here
}
关于安卓工作室 : product flavor combination with more than two flavor dimensions (flavor groups),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37022139/