为不同版本的同类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
的源和资源,而flavorA2
在classA
和classB
有一些小的更改,并且包名也会更改为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仍然从main
select类( classA
和classB
),而不是使用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
,而在flavorA2
是com.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'] } } } }