为同一类的不同版本构建风格

我有一个项目,结构是这样的:

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"
}
}
...

我通过选择 flavorA2的构建变量来运行代码。然而,运行结果表明,年级仍然从 main中选择类(classAclassB) ,而不是在 flavorA2中使用更改后的版本。

我错过了什么吗?

43755 次浏览

您需要在构建文件中指定 sourceSets。您需要修改您的目录结构,使它只有文件夹名称是不同的,在 java 目录下的一切应该是相同的,所以从类名中删除 mk2。我不确定语法是否完全正确,但它应该是这样的:

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


flavorA2 {
java {
srcDirs = ['src/flavorA2/java']
}
}
}
}

在主要的构建变体中,类 A 是 com.abc.flavorA.classA,在 flavorA2中是 com.abc.flavorA.mk2.classA。这是两个不同的完全限定类名,因此是两个不同的类。

您不能真正以一种风格重写整个类。根据您想要做的事情,您可能需要研究 BuildConfig机制——简而言之,这是一个由构建系统生成的类,它的值或语句可以根据构建类型和风格的不同而变化。可以使用运行时代码查看该类中的常数并改变其行为。

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

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

因为你有两个不同的包下的类,这些是完全不同的类。所以班级不会互相取代。

对于风味,您不能覆盖类文件。所以,完成您想要的任务的一种方法是将这些类从 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

这样,无论何时选择一种风味,都只能看到 ClassA 和 ClassB 的一个版本。

在这里发布这个问题的答案,希望有人也能实现同样的功能,在我的例子中,我有两个静态常量,我希望根据构建变量分配不同的值。因此,我已经创建了一个对象并声明了常量,然后通过创建不同的源集将对象放置在两个变量中。

假设这些变量是‘ VSecretariat _ A’和‘ Variant _ B’

Valia _ A/java/package _ name. util.variantspec

object ConfigConstant {
// Carousels
/**
* Changing PERCENT_SCALE_X_IN or PERCENT_SCALE_Y_IN should also change scale animation
* percentages accordingly.
*/
const val PERCENT_SCALE_X_IN = 0.10 // 10% percentage
const val PERCENT_SCALE_Y_IN = 0.10 // 10% percentage
}

Valia _ B/java/package _ name. util.variantspec

object ConfigConstant {
// Carousels
/**
* Changing PERCENT_SCALE_X_IN or PERCENT_SCALE_Y_IN should also change scale animation
* percentages accordingly.
*/
const val PERCENT_SCALE_X_IN = 0.15 // 15% percentage
const val PERCENT_SCALE_Y_IN = 0.15 // 15% percentage
}

从其他类访问

class VerticalCarouselAdapter() {
companion object {
/**
* Changing PERCENT_SCALE_X_IN or PERCENT_SCALE_Y_IN should also change scale animation
* percentages accordingly.
*/
const val PERCENT_SCALE_X_IN = ConfigConstant.PERCENT_SCALE_X_IN
const val PERCENT_SCALE_Y_IN = ConfigConstant.PERCENT_SCALE_Y_IN
}
}