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

标签 android gradle

假设我有一个在 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/Shopsapp/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/

相关文章:

android - 选择标签在原生 Android 浏览器上的样式不正确

android - Android 中的电话键盘和 Qwerty 键盘

java - IntelliJ IDEA 看不到项目 gradle 模块

android - Proguard从Gradle插件2.1.2到2.3.3输出了不同的混淆结果

android - HTML 电子邮件大小调整 - Android

android - Firebase 电话身份验证凭据与 firebase 中的 Google 登录链接

android - addpreferencesfromresource 不推荐使用的解释

gradle - CommandInvokationFailure:Gradle构建失败。 (尚无解决方案)

android - Android Studio 3.5 中的 lambdas 中的“在 * 行找不到可执行代码”

java - 将 Java 应用程序(Azure 函数应用程序)从 GRADLE 2.x 迁移到运行时 3.x