内容简介:Gradle中productFlavors使用详解
最早接触productFlavors是开发第三方Android OS的时候,由于要给不同的厂商做定制,并且适配不同的硬件平台,所以发版本的时候,经常要切换项目分支,然后逐个编译APK。然而有了productFlavors就可以简化这一步操作,不用切换项目分支就可以编译调试不同项目版本的APK,并且可以快速打包所有项目版本的APK。
下面来看下具体用法,在build.gradle(Module:app)中添加productFlavors和flavorDimensions,其中productFlavors用来定义不同特性的产品,flavorDimensions用来定义维度(至少需要定义1个维度)。举个例子:APK要适配不同厂商的不同机型,现在有2个厂商需要适配,于此同时,每个厂商分别有高配,中配,低配3个机型,则定义如下:
flavorDimensions "cooperator", "model" productFlavors { cooperatorA { flavorDimension "cooperator" } cooperatorB { flavorDimension "cooperator" } modelA { flavorDimension "model" } modelB { flavorDimension "model" } modelC { flavorDimension "model" } }
cooperator表示厂商维度,model表示机型维度,最终编译对应12个Build Variant,分别是
cooperatorAmodelADebug cooperatorAmodelARelease cooperatorAmodelBDebug cooperatorAmodelBRelease cooperatorAmodelCDebug cooperatorAmodelCRelease cooperatorBmodelADebug cooperatorBmodelARelease cooperatorBmodelBDebug cooperatorBmodelBRelease cooperatorBmodelCDebug cooperatorBmodelCRelease
配置属性
如果要配置不同的包名,版本号等,可直接在对应的产品定义中指定相应的属性值;如果要配置渠道号可以通过${name}的形式在AndroidManifest.xml中插入一个占位符,编译的时候会替换为真实值。
flavorDimensions "cooperator" productFlavors { cooperatorA { applicationId "com.ckj.myapplication1" manifestPlaceholders = [UMENG_CHANNEL_VALUE:"channel1"] versionCode 1 versionName "1.0" dimension "cooperator" } cooperatorB { applicationId "com.ckj.myapplication2" manifestPlaceholders = [UMENG_CHANNEL_VALUE:"channel2"] versionCode 2 versionName "1.0.1" dimension "cooperator" } }
在AndroidManifest.xml中添加渠道变量
<application ...> ... <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> </application>
配置常量
如果要配置A版本支持自动更新功能,B版本不支持自动更新功能,
格式为:buildConfigField “boolean”, “SUPPORT_AUTO_UPDATE_FEATURE”, “true”
三个字段分别表示:自定义字段类型,自定义字段名,自定义字段值
flavorDimensions "cooperator" productFlavors { cooperatorA { buildConfigField "boolean", "SUPPORT_AUTO_UPDATE_FEATURE", "true" dimension "cooperator" } cooperatorB { buildConfigField "boolean", "SUPPORT_AUTO_UPDATE_FEATURE", "false" dimension "cooperator" } }
添加完后同步下Gradle就可以在编译生成目录(app/build/generated/source/buildConfig)下的BuildConfig.java中看到该自定义字段。在需用用到该自定义字段的代码处直接调用BuildConfig.SUPPORT_AUTO_UPDATE_FEATURE即可获取自定义字段值。
if(isSupportAutoUpdate == BuildConfig.SUPPORT_AUTO_UPDATE_FEATURE){ ... }
配置代码目录
在module目录下创建”src/cooperatorA/java”和”src/cooperatorB/java”目录,与原有的”src/main/java”目录对称,在build.gradle中,通过sourceSets指定cooperatorA和cooperatorB的源码目录。在实际编译过程中,根据选择的Build Variant到指定的源码目录查找源码文件,并且将main目录下的源码和指定目录下的源码进行合并(注:”src/cooperatorA/java”和”src/cooperatorB/java”目录只存放差异类,共有的类依然是在src/main/java目录下)
flavorDimensions "cooperator" productFlavors { cooperatorA { dimension "cooperator" } cooperatorB { dimension "cooperator" } } sourceSets { cooperatorA { java.srcDirs = ['src/cooperatorA/java'] } cooperatorB { java.srcDirs = ['src/cooperatorB/java'] } }
配置资源文件
例如要配置A版本应用名为Name_A,则在src目录下创建cooperatorA目录,并添加如下字符串资源:src/cooperatorA/res/values/strings.xml
<resources> <string name="app_name">Name_A</string> </resources>
“src/cooperatorA”目录默认为cooperatorA flavor的dataSet,运行gradle assemblecooperatorA命令即可生成应用名为Name_A的应用。
flavorDimensions "cooperator" productFlavors { cooperatorA { dimension "cooperator" } cooperatorB { dimension "cooperator" } }
配置不同库
APK运行环境不同,使用的库也会不一样,通常会把所有的库都添加进来,然后跟据运行环境调用不同的库,通过productFlavors我们可以针对不同的product编译指定的库,无需编译无用库。
flavorDimensions "cooperator" productFlavors { cooperatorA { dimension "cooperator" } cooperatorB { dimension "cooperator" } } dependencies { cooperatorACompile 'com.squareup.retrofit2:retrofit:2.2.0' }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
机器学习系统设计
[德] Willi Richert、Luis Pedro Coelho / 刘峰 / 人民邮电出版社 / 2014-7-1 / CNY 49.00
如今,机器学习正在互联网上下掀起热潮,而Python则是非常适合开发机器学习系统的一门优秀语言。作为动态语言,它支持快速探索和实验,并且针对Python的机器学习算法库的数量也与日俱增。本书最大的特色,就是结合实例分析教会读者如何通过机器学习解决实际问题。 本书将向读者展示如何从原始数据中发现模式,首先从Python与机器学习的关系讲起,再介绍一些库,然后就开始基于数据集进行比较正式的项目开......一起来看看 《机器学习系统设计》 这本书的介绍吧!