我有一个共享代码库,然后由具有多种风格的应用程序使用,具体取决于它的发布位置。
我尝试过同时使用Android插件的1.5版,2.0版和2.1版。 Gradle 2.8,2.10和2.10。
该框架为不同的SKU定义了许多产品风格,但是我遇到了一些问题。第三方广告提供商,IAP系统等存在一些依赖关系,这些依赖关系应仅包含在正确的SKU中。
类似地,某些类只是在一个平面目录中,并且只应包含在正确的构建风格中。 (这是旧版本设置的遗留问题,我们目前正在尝试清理所有内容并正确地移动到gradle上。)
但是,如果我尝试根据产品风格定义项目或文件依赖项,则它们将无法正确包含,从而导致错误。在下面的示例中,引用Sku2Utils或sku2 IAP的java类会因缺少符号或包不存在而失败。
apply plugin: 'com.android.library'
android {
publishNonDefault true
productFlavors {
sku1 {
}
sku2 {
}
}
sourceSets {
main {
}
sku1 {
}
sku2 {
}
}
}
dependencies {
//seems fine
sku1Compile 'com.google.android.gms:play-services:9.0.0'
//or
//compile 'com.google.android.gms:play-services:9.0.0'
//also fine
compile files('./some/path/common-IAP.jar')
//project works
compile project(':HelpfulProject')
//doesn't function as expected?
sku2Compile project(':Sku2Utils')
//similarly doesn't seem to function correctly
sku2Compile files('./some/path/sku2-IAP.jar')
}
为清楚起见,子项目位置定义为
include ':Sku2Utils'
project(":Sku2Utils").projectDir = new File("../../../some/path/sku2/Sku2Utils/")
然后作为依赖添加到App
defaultConfig.with {
applicationId "com.companyname.awesomeapp"
}
android {
productFlavors {
sku1 {
}
sku2 {
}
}
}
dependencies {
sku1Compile project(path: ':framework', configuration: 'sku1Release')
sku2Compile project(path: ':framework', configuration: 'sku2Release')
}
我已经启用了proguard以减少应用程序的大小,但我认为它不会导致任何问题。如果我删除依赖项,我可以正确地获得至少1个sku构建而没有任何问题我似乎无法在不使用未使用的商店/广告提供商的情况下使应用程序膨胀的情况下工作。
另外,排除类似乎无法使用sourceSets正常工作
sourceSets {
main {
java.excludes = ['**/SomeOldFile.java']
}
sku1 {
java {
excludes = ['**/Sku2Class.java', '**/Sku2Helper.java']
}
}
sku2 {
java.excludes = ['**/Sku1Class.java', '**/Sku1Helper.java']
}
}
按预期使用主要设置功能排除文件,但尝试从特定风格中排除类似乎不会被使用。
将上述类拆分为不同的目录/ sku1 /和/ sku2 /然后将它们定义为java源目录会更正确吗?
(白名单列出了我们需要的文件,而不是包含所有内容,然后再删除?)