假设我有一个在 map 上显示位置的应用程序。
现在,我想对该应用程序进行几种不同的变化,一个显示商店,一个显示餐馆,等等。
在其中一些应用中,我希望包含广告,而在其他应用中,我不想包含广告。
如何选择性地将某些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-结构中的语法不正确。
我试图避免必须分别为每种口味指定文件夹,因此请使用.ext.hasAds bool(boolean) 值。
如何实现根据特定 bool(boolean) 值指定特定的srcDirs?
更新
我修好了它。意思是我得到了我想要的。但是我对如何做不是很高兴:
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。variantfilter检查每个变量的2种口味,它们应具有匹配的
ext.hasAds
(在口味中定义)。如果它们不匹配,请忽略此变体。
最佳答案
如果您使用的是Android Studio,则app
文件夹包含main
文件夹,其中包括所有配置的默认源,xml, Assets 等。您还可以创建应用程序/ [flavor] 文件夹(例如app/Shops
,app/Restaurants
),并放入为 flavor 资源指定的所有文件夹。
例如,您的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
}
关于android - 如何根据Android构建中的自定义扩展变量有选择地将srcDir添加到 flavor 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36858686/