2016-04-26 50 views
0

假設我有一個顯示地圖位置的應用程序。 現在我想做這個應用程序的幾個不同的變化,一個顯示商店,一個顯示餐館等。如何根據Android構建中的自定義擴展變量有選擇地添加srcDir以調味?

在這些應用程序的一些我想包括廣告,在其他人我不。

我該如何選擇性地將某些srcDirs添加到一種味道而不是另一種?我嘗試了以下內容:

productFlavors { 
    Shops { 
     applicationId "com.me.shops" 
     ext.hasAds = true 
    } 

    Restaurants { 
     applicationId "com.me.restaurants" 
     ext.hasAds = false 
    } 

    ... more flavors with ext.hasAds either true or false 
} 

applicationVariants.all { variant -> 
    String withAdsDir = 'src/withAds' 
    String withoutAdsDir = 'src/withoutAds' 

    if (variant.productFlavors.get(0).ext.hasAds) { 
     variant.sourceSets java.srcDir withAdsDir + '/java' 
     variant.sourceSets res.srcDir withAdsDir + '/res' 
    } 
    else { 
     variant.sourceSets java.srcDir withoutAdsDir + '/java' 
     variant.sourceSets res.srcDir withoutAdsDir + '/res' 
    } 
} 

但是,這失敗了,因爲其中一個if-structure中的語法不正確。

我想避免必須分別指定每個風味的文件夾,因此使用.ext.hasAds布爾值。

如何根據某個布爾值來實現指定特定的srcDirs?

UPDATE

我 '固定' 它。意思是我得到我想要的。但我不是很高興如何:

flavorDimensions "adsornot", "typeofapp" 

productFlavors { 
    Shops { 
     applicationId "com.me.shops" 
     ext.hasAds = true 
     dimension "typeofapp" 
    } 

    Restaurants { 
     applicationId "com.me.restaurants" 
     ext.hasAds = false 
     dimension "typeofapp" 
    } 

    Ads { 
     ext.hasAds = true 
     dimension "adsornot" 
    } 

    NoAds { 
     ext.hasAds = false 
     dimension "adsornot" 
    } 
} 

sourceSets { 
    String withAdsDir = 'src/withAds' 
    String withoutAdsDir = 'src/withoutAds' 

    Ads { 
     java.srcDir withAdsDir + '/java' 
     res.srcDir withAdsDir + '/res' 
    } 

    NoAds { 
     java.srcDir withoutAdsDir + '/java' 
     res.srcDir withoutAdsDir + '/res' 
    } 
} 

variantFilter { variant -> 
    boolean shouldHaveAds = variant.getFlavors().get(0).ext.hasAds 
    boolean variantHasAds = variant.getFlavors().get(1).ext.hasAds 

    variant.setIgnore(shouldHaveAds != variantHasAds) 
} 

說明:

我創建2種尺寸:類型的應用程序內,和廣告有或沒有

這意味着將有生成4個變體。但我只想要2.變體過濾器檢查每個變體的兩種口味,它們應該匹配ext.hasAds(在口味中定義)。如果它們不匹配,請忽略此變體。

回答

0

如果您使用Android Studio,您的app文件夾包含main文件夾,其中包含所有配置的默認來源,xmls,資產等。您還可以創建應用程序/ [flavor]文件夾(例如,app/Shops,app/Restaurants)並放入指定的所有風味資源。

例如,您的build.gradle文件包含以下口味:

flavorDimensions "deployment" 

productFlavors { 
    development { 
     dimension "deployment" 
     applicationId "com.example.myapp.dev" 
     buildConfigField "boolean", "USE_ADS", "false" 
    } 
    production { 
     dimension "deployment" 
     applicationId "com.example.myapp" 
     buildConfigField "boolean", "USE_ADS", "true" 
    } 
} 

要爲開發配置創建自定義的資源,你需要的只是創建應用程序/開發文件夾中。它應該具有與應用/主要相同的結構。

在你的代碼的gradle中文件規定,檢查自定義標記後:

 // check gradle flags 
    if (BuildConfig.USE_ADS) { 
     // insert ads 
    } 
+0

但我專門談的不是味道,討論一下如何利用廣告或沒有時。使用廣告是一種風味的屬性,而不是味道本身。 – xorgate

+0

@xorgate:您可以在您的build.gradle中爲每種風味定製的廣告提供標誌。例如,'buildConfigField「boolean」,「USE_ADS」,「true」' –

+0

但這不是我想要的。當使用buildConfigField時,即使我根本不想使用廣告,代碼和資源也會添加到apk中(並且我必須添加庫)。 – xorgate

相關問題