android 为同一个类的不同版本构建风味

bbuxkriu  于 12个月前  发布在  Android
关注(0)|答案(4)|浏览(186)

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

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的构建变体来运行代码。然而,运行结果显示,gradle仍然选择main中的类(classAclassB),而不是使用flavorA2中的更改版本。
我是不是漏掉了什么?

jq6vz3qz

jq6vz3qz1#

因为你有两个不同包下的类,所以它们是完全不同的类。所以这些类不会互相替换。
对于flavors,您不能覆盖类文件。因此,实现您想要的功能的一种方法是将这些类从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将可见。

6yt4nkrj

6yt4nkrj2#

在主构建变体中,A类是com.abc.flavorA.classA,在flavorA2中是com.abc.flavorA.mk2.classA。这是两个不同的完全限定类名,因此是两个不同的类。
你不能真的在一个风格中覆盖整个类。根据您想要做的事情,您可能想要研究BuildConfig机制--简而言之,这是一个由构建系统生成的类,它可以根据构建类型和风格而具有不同的值或语句。您可以让运行时代码查看该类中的常量并改变其行为。
有关语法的更多信息,请参见Android Studio Update 0.4.0 could not find buildConfig(),但简单来说,它看起来像这样:

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

wqnecbli3#

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

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

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

h22fl7wq4#

把这个答案贴在这里,希望有人能实现同样的答案;在我的例子中,我有两个静态常量,我想根据构建变量分配不同的值。因此,我创建了一个对象并声明了常量,然后通过创建不同的源集将对象放置在两个变量中。
假设变量为“变量A”和“变量B”

  • 变量_A/java/package_name.util.variantspec*
object ConfigConstant {
    // Carousels
    /**
     * Changing PERCENT_SCALE_X_IN or PERCENT_SCALE_Y_IN should also change the animation scale
     * percentages accordingly.
     */
    const val PERCENT_SCALE_X_IN = 0.10 // 10% percentage
    const val PERCENT_SCALE_Y_IN = 0.10 // 10% percentage
}
  • 变量_B/java/package_name.util.variantspec*
object ConfigConstant {
    // Carousels
    /**
     * Changing PERCENT_SCALE_X_IN or PERCENT_SCALE_Y_IN should also change the animation scale
     * 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 the animation scale
         * percentages accordingly.
         */
        const val PERCENT_SCALE_X_IN = ConfigConstant.PERCENT_SCALE_X_IN
        const val PERCENT_SCALE_Y_IN = ConfigConstant.PERCENT_SCALE_Y_IN
  }
}

相关问题