如何根据 Android 构建中的自定义扩展变量有选择地将 srcDir 添加到风格中



假设我有一个在地图上显示位置的应用程序。现在我想制作这个应用程序的几种不同变体,一个显示商店,一个显示餐馆等。

在其中一些应用程序中,我想包含广告,在其他应用程序中则不然。

如何有选择地将某些 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/Shopsapp/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
    }

最新更新