2014-06-25 69 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 

這提供了一種快速且更靈活的方式來使用構建命令來切換事物,但是它太多了,而且事情會很快變得雜亂無章。