我有一个项目,结构是这样的:
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"
}
}
...
我通过选择flavorA2
的构建变体来运行代码。然而,运行结果显示,gradle仍然选择main
中的类(classA
和classB
),而不是使用flavorA2
中的更改版本。
我是不是漏掉了什么?
4条答案
按热度按时间jq6vz3qz1#
因为你有两个不同包下的类,所以它们是完全不同的类。所以这些类不会互相替换。
对于flavors,您不能覆盖类文件。因此,实现您想要的功能的一种方法是将这些类从
main
中移到flavorA
中。所以你会有这样的东西:
这样,每当您选择一种风味时,只有一个版本的ClassA和ClassB将可见。
6yt4nkrj2#
在主构建变体中,A类是
com.abc.flavorA.classA
,在flavorA2
中是com.abc.flavorA.mk2.classA
。这是两个不同的完全限定类名,因此是两个不同的类。你不能真的在一个风格中覆盖整个类。根据您想要做的事情,您可能想要研究
BuildConfig
机制--简而言之,这是一个由构建系统生成的类,它可以根据构建类型和风格而具有不同的值或语句。您可以让运行时代码查看该类中的常量并改变其行为。有关语法的更多信息,请参见Android Studio Update 0.4.0 could not find buildConfig(),但简单来说,它看起来像这样:
wqnecbli3#
您需要在构建文件中指定
sourceSets
。你需要修改你的目录结构,使之只有文件夹名称不同,java目录下的所有内容都应该是相同的,所以从类名中删除mk2
。我不确定语法是否完全正确,但它应该是这样的:h22fl7wq4#
把这个答案贴在这里,希望有人能实现同样的答案;在我的例子中,我有两个静态常量,我想根据构建变量分配不同的值。因此,我创建了一个对象并声明了常量,然后通过创建不同的源集将对象放置在两个变量中。
假设变量为“变量A”和“变量B”
从别的班来的