假设我有一个在地图上显示位置的应用程序。现在我想制作这个应用程序的几种不同变体,一个显示商店,一个显示餐馆等。
在其中一些应用程序中,我想包含广告,在其他应用程序中则不然。
如何有选择地将某些 srcDir 添加到一种口味中,而不是另一种口味中?我尝试了以下方法:
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 布尔值。
如何根据某个布尔值指定特定的 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。变体过滤器检查每个变体的 2 种口味,它们应该具有匹配的ext.hasAds
(在口味中定义)。如果它们不匹配,请忽略此变体。
如果您使用 Android Studio,您的app
文件夹包含main
文件夹,其中包含所有配置的默认源、xml、资产等。您还可以创建 app/[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
}