Android基础风格没有重复的类错误

anb*_*ber 5 android gradle android-productflavors

我有我的应用程序的几个版本:普通版,说mainapp和几个建立每个客户的具体,比如说custom1,custom2,custom3.我希望所有customX口味都有基调.

我试图这样做:

创建项目结构:

app\src\main
app\src\mainapp
app\src\commonflavor
app\src\custom3
Run Code Online (Sandbox Code Playgroud)

并配置:

productFlavors {
    mainapp {
    }
    custom1 {
    }
    custom2 {
    }
    custom3 {
    }
}

sourceSets {
    custom1 {
        java.srcDirs = ['src/commonflavor/java']
    }
    custom2 {
        java.srcDirs = ['src/commonflavor/java']
    }
    custom3 {
        java.srcDirs = ['src/commonflavor/java', 'src/custom3/java']
    }
}
Run Code Online (Sandbox Code Playgroud)

commonflavor我为所有customX风格添加常见的java类时,请说MainActivity.javaSecondActivity.java.但是custom3我需要分开SecondActivity.java.

在这种情况下,我有一个错误error: duplicate class: SecondActivity来自src/commonflavor/javasrc/custom3/java.

现在我已经使用class dupllication解决了这个问题:

sourceSets {
    custom1 {
        java.srcDirs = ['src/commonflavor/java']
    }
    custom2 {
        java.srcDirs = ['src/commonflavor/java']
    }
    custom3 {
        java.srcDirs = ['src/custom3/java']
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经src/commonflavor/java从srcDirs 复制并复制MainActivity.javacustom3.问题是我有2个MainActivity.java文件克隆src/commonflavor/javasrc/custom3/java

如何在没有代码重复的情况下解决这种情况?

anb*_*ber 2

我发现的最好的解决方案是在 app\src\main 中编写所有类并在需要的地方添加:

if(BuildConfig.FLAVOR.equals("mainapp")) {
  // mainapp code
} else {
  // coomon flavor code
}
Run Code Online (Sandbox Code Playgroud)

  • 我对这种方法有点担心,因为 apk 可能会被反编译,并且“FLAVOR”很容易更改为“pro”。 (4认同)
  • 但这不会增加您的 apk 大小,因为它包含所有文件,但是当您使用风味类型构建时,您不需要的风味文​​件将不会被编译,并且您的 apk 大小会减小。 (4认同)