为不同版本的同类build立口味

我有一个项目,结构如下:

project/ | |---src/ |---flavorA2/ | | | |---java/ | | |---com.abc.flavorA.mk2 | | |-----classA.java | | |-----classB.java | |---res/ | |---AndroidManifest.xml | |---main | |---java/ | | |---com.abc.flavorA | | |-----classA.java | | |-----classB.java | | |-----classC.java | | |-----classD.java | |---res/ | | |---drawable/ | | |---layout/ | | |---values/ | | | |---AndroidManifest.xml | |---flavorA 

flavorA将完全使用来自main的源和资源,而flavorA2classAclassB有一些小的更改,并且包名也会更改为com.abc.flavorA.mk2

我有这样的build.gradle文件:

 ... buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } productFlavors { flavorA2 { packageName "com.abc.flavorA.mk2" versionCode 2 versionName "1.0.1" } flavorA { packageName "com.abc.flavorA" } } ... 

我通过select构build变体flavorA2来运行代码。 但运行结果显示gradle仍然从mainselect类( classAclassB ),而不是使用flavorA2的已更改的版本。

我在这里错过了什么?

既然你有两个不同的包下的类,这是完全不同的类。 所以这些课程并没有相互替代。

随着口味,你不能重写类文件。 所以,实现你想要的一种方法就是把这些类移出main ,并转化为flavorA

所以你会有这样的事情:

 project/ | |---src/ |---flavorA2/ | | | |---java/ | | |---com.abc | | |-----classA.java | | |-----classB.java | |---res/ | |---AndroidManifest.xml | |---main/ | |---java/ | | |---com.abc.flavorA | | |-----classC.java | | |-----classD.java | |---res/ | | |---drawable/ | | |---layout/ | | |---values/ | | | |---AndroidManifest.xml | |---flavorA/ | |---java/ | | |---com.abc | | |-----classA.java | | |-----classB.java 

这样,每当你select一个风味,只有一个版本的ClassA和ClassB将是可见的。

在主构build变体中,类A是com.abc.flavorA.classA ,而在flavorA2com.abc.flavorA.mk2.classA 。 这是两个不同的完全合格的类名,因此有两个不同的类。

你不能真正覆盖整个类的味道。 根据你想要做什么,你可能想要看看BuildConfig机制 – 简而言之,这是一个由构build系统生成的类,它可以具有根据构buildtypes和风格而变化的值或语句。 你可以使用运行时代码来查看该类中的常量并改变其行为。

有关语法的更多信息,请参阅Android Studio Update 0.4.0找不到buildConfig() ,但简而言之,它看起来像这样:

 productFlavors { flavor { buildConfigField "boolean", "MY_FLAG", "true" } } 

您需要在构build文件中指定sourceSets 。 你需要修改你的目录结构,使得只有文件夹名称不同,java目录下的所有东西都应该是相同的,所以从类名中删除mk2 。 我不确定语法是否完全正确,但应该如下所示:

 android { sourceSets { flavorA { java { srcDirs = ['src/flavorA/java'] } } flavorA2 { java { srcDirs = ['src/flavorA2/java'] } } } }