我正在使用 Android Studio(v 2.1,gradle 插件 v 2.1.0)开发 Android 应用程序。我的应用程序有各种版本,它们共享许多通用代码,因此我决定使用风格维度和产品风格来在需要时和地点自定义代码和资源。只要我只有两个风味维度,这种方法就可以正常工作。举个例子,我的app.gradle
was
…
flavorDimensions "fruit", "color"
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
}
…
and my 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
.
在开发过程中的某个时刻,我必须包括一个free and a paid应用程序的版本。我认为通过添加一个名为的新风味维度可以轻松实现version
和两种产品口味命名为free
and 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
and color
Android Studio 不再检测到。所以不行appleRed
, appleYellow
, pearRed
nor pearYellow
可以用于拥有自定义代码,而我能够重新获得配置的唯一方法是使用所有三个风味维度的所有组合:
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 的预期行为吗(i.e.,当具有两个以上风味维度时,无法组合产品风味的子集(根据其维度遵循其优先级)?
2)鉴于这是预期的行为,是否有另一种方法可以实现我的自定义,而无需重复代码或没有带有以下内容的单个文件if 语句里面 (e.g., if (BuildConfig.FLAVOR_version == "free") ...
) ?
请注意,我谈论的是可能很复杂的自定义代码,因此我并不要求进行基本的自定义,例如构建配置变量、变体过滤或类似的东西。