我正在使用 Android Studio(v 2.1,gradle plugin v 2.1.0)开发一个 Android 应用程序。我的应用程序有各种版本,它们共享许多通用代码,因此我决定使用风味维度和产品风味来定制代码和资源,无论何时何地都需要。只要我只有两个风味维度,这就行了。例如,我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
当然,没有ExampleFragment
in 的实例src/main
。
在开发过程中的某个时候,我必须包含应用程序的免费和付费版本。我认为可以通过添加一个名为的新风味维度和两个名为and的version
产品风味轻松实现:free
paid
…
flavorDimensions "fruit", "color”, “version”
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
free {
dimension "version"
}
paid {
dimension “version”
}
}
…
但是突然之间,由 和 组合生成的自定义代码fruit
不再color
被Android Studio检测到。所以 no appleRed
, appleYellow
, pearRed
norpearYellow
不能用于自定义代码,我能够重新获得配置的唯一方法是使用所有三个风味维度的所有组合:
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") ...
)的情况下实现我的自定义?
请注意,我说的是拥有可能很复杂的自定义代码,所以我不是要求基本的自定义,如构建配置变量、变体过滤或类似的东西。