2013-10-24 32 views
6

我想知道是否有可能爲特定的風味組提供文件或配置設置組合。例如,我有2個味組,每組2種不同的口味:配置特定的gradle組合

味組:版本

  • V2
  • V3

味組:類型

  • 免費
  • 全部

當下令 「類型」, 「版本」 我是能夠建立4種不同的我的應用程序的口味:

  • FreeV2
  • FreeV3
  • FullV2
  • FullV3

而我的源碼樹看起來像這樣:

/src 
    /free 
     /res 
    /full 
     /res 
    /v2 
     /java 
     /res 
     AndroidManifest.xml (features and permissions for v2 flavors) 
    /v3 
     /java 
     /res 
     AndroidManifest.xml (features and permissions for v3 flavors) 

這正是我想要的,並且對我的項目非常有效。不過,我希望我可以爲特定的風味組合組合提供文件。例如,我想爲FullV3和FullV2提供不同的AndroidManifest。我不認爲這是可能的,或者?例如:

/src 
    /free 
     /res 
    /full 
     /res 
    /v2 
     /java 
     /res 
     AndroidManifest.xml (features and permissions for v2 flavors) 
    /v3 
     /java 
     /res 
     AndroidManifest.xml (features and permissions for v3 flavors) 
    /fullv3 
     AndroidManifest.xml (features and permissions for full v3 only!) 
    /fullv2 
     AndroidManifest.xml (features and permissions for full v2 only!) 

我會很高興,能夠做到這一點的gradle這個構建文件以及:

productFlavors { 
    free { 
     packageName ... 
     flavorGroup "type" 
    } 
    full { 
     packageName ... 
     flavorGroup "type" 
    } 
    v2 { 
     packageName ... 
     flavorGroup "version" 
    } 
    v3 { 
     packageName ... 
     flavorGroup "version" 
    } 
    fullv2 { 
     ... <-- specifically for the full-v2 combination 
    } 
    fullv3 { 
     ... <-- specifically for the full-v3 combination 
    } 
} 

注:一個解決辦法是隻有1個組和定義4種口味明確:

  • freeV2
  • freeV3
  • fullV2
  • fullV3

然而,這不是我一個可行的解決方案,因爲我會重複所有的每一個版本的自由和充分的味道版本的特定代碼。

回答

0

當風味彙集在一起​​時,文件將被合併。因此,如果您有fullv3中的清單,則會在生成fullV3時合併它們。這樣你可以得到組合生成。

0

根據提問的問題,您需要爲v2和v3的完整版本提供不同的AndroidManifest文件。因此,您可以根據您的方便使用flavor和buildTypes的組合來代替完全免費的風格。

例如

我知道完全和自由應該是產品的口味沒有建立類型,但你的要求說,全面而自由是你buildTypes和v2和v3是你的應用程序的口味

buildTypes { 

    debug { 
    runProguard false 
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 

    } 

    full{ 
    runProguard false/true 
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    signingConfig signingConfigs.prodSigning // write your signingConfig 

    } 

    free{ 
    runProguard false/true 
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    signingConfig signingConfigs.prodSigning // write your signingConfig 

    } 
} 

productFlavors{ 

    v2 { 
    //required configuration for full version 

    } 

    v3 { 
     //required configuration for full version 

    } 

    } 

現在你項目結構應該是這樣的。

--src 
    ---main 
     ----java 
     ----res 
     ----Manifest 
    ---full 
     ----java 
     ----res 
     ----Manifest(Manifest you want for Full Version) 
    ---free 
     ----java 
     ----res 
     ----Manifest (Manifest you want for Free Version) 
    ---v2 
     ----java 
     ----res 
     ----Manifest 
    ---v3 
     ----java 
     ----res 
     ----Manifest 

同步與搖籃後,這會給在左窗格中構建變量標籤構建類型的組合,併爲同一個不同的任務。

轉到Build Variant並根據您的選擇從下拉生成生成。

它會給你生成變種這樣

enter image description here

8

此功能的版本中加入Android plugin for Gradle

http://tools.android.com/tech-docs/new-build-system <的0.7.0 - 由於1/6/14,此鏈接處於活動狀態

如果您有口味,您現在可以擁有變體特定的源文件夾。

  • 僅適用於應用程序(不是庫或測試)。名稱是src/flavorDebug/...src/flavor1Flavor2Debug/
    • 請注意camelcase的命名,首字母小寫。
  • 它的組件(res,manifest等)具有比構建類型或flavor更高的優先級。
  • 當使用多個味道維度時,還有一個「風味組合」源文件夾可用。例如src/flavor1Flavor2/
    • 請注意,這是針對所有尺寸的所有組合。
    • 它的優先級高於單一風格的源代碼集,但低於構建類型。

更新2014年1月30日

的IntelliJ IDEA v13.0.2(編譯133.696)現在支持0.7的Android做插件搖籃變化。0

+3

您是否知道在構建中執行特定風味組合的語法文件也是這樣,問題的後半部分? – mm2001

+2

「請注意,這是針對所有維度的所有組合。」 是否有可能使它不適用於所有維度的組合以及其中一些維度的組合? –

0

設定各個風味組合配置在生成文件中,你可以使用我這裏提出的解決方案:https://stackoverflow.com/a/26585241

然後,您可以使用和variantFilter通過所有的口味組合搭配上的每個組合的名稱重複(就像在創建「風味組合」源文件夾時使用的名稱一樣,您可以在@abest的答案中提到特定資源):

android.variantFilter { variant -> 
    def flavorString = "" 
    def flavors = variant.getFlavors() 
    for (int i = 0; i < flavors.size(); i++) { 
     flavorString += flavors[i].name; 
    } 
    if(flavorString.equalsIgnoreCase("fullv2")) { 
     variant.getDefaultConfig().applicationId "com.example.fullv2" 
    }