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

时间:2016-04-26 07:54:40

标签: android gradle

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

在其中一些应用中,我想要包含广告,而在其他应用中我不想。

如何有选择地将某些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布尔值。

如何根据某个布尔值来指定特定的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个风格维度:app-type和ads-or-not

这意味着将生成4个变体。但我只想要2. variantfilter检查每个变体的2种口味,它们应该匹配ext.hasAds(在口味中定义)。如果它们不匹配,请忽略此变体。

1 个答案:

答案 0 :(得分:0)

如果您使用Android Studio,则app文件夹包含main文件夹,其中包含所有配置的默认来源,xmls,资源等。您还可以创建 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"
    }
}

要为开发配置创建自定义资源,只需创建 app / development 文件夹即可。它应该与 app / main 具有相同的结构。

之后检查代码中gradle文件中提供的自定义标志:

        // check gradle flags
    if (BuildConfig.USE_ADS) {
        // insert ads
    }