假設我有一個顯示地圖位置的應用程序。 現在我想做這個應用程序的幾個不同的變化,一個顯示商店,一個顯示餐館等。如何根據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
(在口味中定義)。如果它們不匹配,請忽略此變體。
但我專門談的不是味道,討論一下如何利用廣告或沒有時。使用廣告是一種風味的屬性,而不是味道本身。 – xorgate
@xorgate:您可以在您的build.gradle中爲每種風味定製的廣告提供標誌。例如,'buildConfigField「boolean」,「USE_ADS」,「true」' –
但這不是我想要的。當使用buildConfigField時,即使我根本不想使用廣告,代碼和資源也會添加到apk中(並且我必須添加庫)。 – xorgate