【发布时间】:2016-08-29 13:28:37
【问题描述】:
我正在使用 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
当然,src/main 中没有 ExampleFragment 的实例。
在开发过程中的某个时候,我不得不包含一个免费和一个付费版本的应用程序。我认为可以通过添加一个名为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 检测到。因此,appleRed、appleYellow、pearRed 和 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 的预期行为吗(ie,当具有两种以上的风味时,无法组合产品风味的子集,根据它们的维度遵循它们的优先级尺寸)?
2) 鉴于这是预期的行为,有没有另一种方法可以实现我的自定义,而无需重复代码或没有一个包含 if 语句 的单个文件(例如,if (BuildConfig.FLAVOR_version == "free") ...) ?
请注意,我所说的自定义代码可能很复杂,因此我并不是要求进行基本的自定义,例如构建配置变量、变体过滤或类似的东西。
【问题讨论】:
标签: android android-studio android-gradle-plugin android-productflavors android-flavordimension