2014-06-25 71 views
3

我有一个由不同模块组成的Android项目(已经移植到Android Studio并使用Gradle)。有条件依赖Gradle,有可能吗?

该项目实际上用于创建两个不同的应用程序,代码几乎相同,除了一些资源。

因此资源被分成两个不同的模块。

该项目的原创作者曾在Eclipse中工作,并根据他想构建的应用程序切换依赖关系中包含的资源模块。而且他还用手动更改了AndroidManifest.xml中的包名称

我想将所有这些自动化,仍然有一个代码库,但是每个目标都有两个具有特定模块的构建目标。这对Gradle有用吗?

更新:

为了使事情变得更加困难,我的项目有一个层次是非常如下:

--+--MainProject 
    +--LibData 
    +--LibBase 
    +--LibResA 
    +--LibResB 

其中:

  • MainProject取决于LibBase和LibData。
  • LibData取决于LibBase
  • LibBase要么依赖LibResA或LibResB基于我需要建立的最终APK。

至于建议,我试着用口味实施这一通过增加在MainProject的build.gradle如下:

productFlavors { 
    producta { 
    } 
    productb { 
    } 
} 

然后在LibBase我已经添加了以下到它的build.gradle :

dependencies { 
    productaCompile project(':LibResA') 
    productbCompile project(':LibResB') 
} 

但是,当我构建项目时,LibData找不到从LibBase继承的类和资源。所以现在我坚持这个错误。对我来说,它看起来像LibBase没有被复制到LibData的中间体。这样LibData无法解析LibBase中的类,但这只是我的假设。

更新2:

我一直在调查这个问题,现在我已经改变了我的build.gradle文件看起来像这样:

主项目的build.gradle:

defaultPublishConfig "productaRelease" 
publishNonDefault true 

productFlavors { 
    producta { 
     applicationId "com.producta" 
    } 

    productb { 
     applicationId "com.productb" 
    } 
} 

dependencies { 
    compile project(':LibData') 
} 

LibData build.gradle(没有产品口味,只是依赖关系):

dependencies { 
    compile project(':LibBase') 
} 

LibBase build。gradle这个:

defaultPublishConfig "productaRelease" 
publishNonDefault true 

productFlavors { 
    producta { 
    } 

    productb { 
    } 
} 

dependencies { 
    productaCompile project(path: ':LibResA') 
    productbCompile project(path: ':LibResB') 
} 

这样做通常gradle clean build,但我可以看到,包括资源总是那些LibResA就像defaultPublishConfig是在任何时候都使用的只有一个,当我得到任何错误。

如果我在Android Studio(0.8.1 atm)中打开此项目,结果是如果我尝试切换LibBase模块的构建变体并将其设置为productbRelease,则显示以下错误:Error:Module 'LibBase'选择了变体'productbRelease',但模块'LibData'取决于变体'productaRelease'。

我正在用尽想法。

回答

1

是的。基于Gradle的新Android构建系统以其产品风格的概念支持您的使用案例。 http://tools.android.com/tech-docs/new-build-system/user-guide

请注意,在迁移到Gradle构建时,您可能希望从Eclipse切换到Android Studio。

+0

您是否知道产品风味是否只能在主项目的build.gradle中指定,或者是否可以在库模块中使用? –

+0

我发现风味只适用于根项目。 AFAIK,没有办法指定你的根项目所依赖的库的风格。这将是一个很好的功能。 –

+0

@JeffBrateman我已经完成了Radim的建议,我已经用我所做的更新了原始问题。显然,即使我在根项目中指定了风味,但依赖于实际包含基于风味的不同资源的模块的模块仍存在问题。任何想法,如果有这个解决方法? –

2

不是最好的方法,但如果productFlavors不足以指定条件依赖关系,则可以依赖inline if并根据可通过external properties注入的某些值对其进行评估。

例如这里是我如何切换LeakCanary(无操作只是空实现另一种的):

的build.gradle

dependencies { 
    compile "com.squareup.leakcanary:leakcanary-android"+(project.ext.has("leakCanary")?"":"-no-op")+":1.3.1" 
} 

建设有com.squareup.leakcanary:leakcanary-android:1.3.1

$ ./gradlew :app:assembleDebug -PleakCanary 

默认情况下,它使用空实现com.squareup.leakcanary:leakcanary-android-no-op:1.3.1构建:

$ ./gradlew :app:assembleDebug 

这提供了一种快速且更灵活的方式来使用构建命令来切换事物,但是它太多了,而且事情会很快变得杂乱无章。