android-library flavor依赖项和自定义源集

时间:2016-10-20 10:00:23

标签: java android gradle android-library

我有一个共享代码库,然后由具有多种风格的应用程序使用,具体取决于它的发布位置。

我尝试过同时使用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源目录会更正确吗?

(白名单列出了我们需要的文件,而不是包含所有内容,然后再删除?)

0 个答案:

没有答案