需要事先说明的是,接下来所说的“意义”并非官方文档翻译,而是结合了小盆友自己的理解,会比较口语化。
flavorDimensions从单词字面理解知道是“风味维度”,是需要结合“产品风味(即productFlavors)”来一起使用的。
flavorDimensions的使用会定义出维度,供接下来的productFlavors使用。我们举个例子
android{ //省略其他参数 flavorDimensions('abi','version')}使用上面代码,则会定义出两个维度:version和abi。一个参数一个维度,我们把它形象化,就可以看成下面这样一张图。而他有什么作用,我们看下一小节。
如果三个参数就可以看成一个三维的空间坐标系,这里的坐标系只是一个形象化的体现。
productFlavors从字面了解是“产品风味”。他需要和一个风味维度对接,否则会报错。
接着我们上面的例子,使用productFlavors定义维度上的风味,使用dimension关联。
android{//其他参数 flavorDimensions('abi','version')//创建产品风味productFlavors{v1{//关联纬度dimension'version'}v2{dimension'version'}v3{dimension'version'}x86{dimension'abi'}armV7{dimension'abi'}}}通过上面这段代码,会形成下面这张图。在abi维度上关联了两个产品,即“armV7”和“x86”,在version的维度上关联了三个产品,即“v1”、“v2”和“v3”。
而这些维度的交织就会形成最终的风味,即我们上面所标出来的“armV7V1”、“armV7V2”、“armV7V3”、“x86V1”、“x86V2”、“x86V3”。
我们可以根据不同的风味,打出不同的apk包,便可以实现一套核心代码打出多个有些差异的包。
productFlavors下的每个项最终形式是productFlavor,即我们上面说所的“v1”,“v2”.....
我们知道,每个配置最终会被映射为一个类,或是一个属性、或一个方法。productFlavor也不例外,他会被映射为com.android.build.gradle.internal.dsl.ProductFlavor,继承结构如下
我们先来一个约定,避免使用的代码过于冗长。
我们配置差异化的logo和app名字,则可以在gradle中使用下面这段
android{flavorDimensions('abi','version')productFlavors{ //省略其他的风味配置 x86{dimension'abi' //配置不同的包名,达到能两个风味能共存applicationId'com.zinc.bear'manifestPlaceholders=[logo:"@drawable/logo_bear",appName:"bear",] //配置签名signingConfigsigningConfigs.jiangpengyong}armV7{dimension'abi' //配置不同的包名,达到能两个风味能共存applicationId'com.zinc.shark'manifestPlaceholders=[logo:"@drawable/logo_shark",appName:"shark",] //配置签名signingConfigsigningConfigs.xiaopenyou}}}logo的资源图
然后在AndroidManifest.xml中使用,使用${你配置的变量名}
举个例子:我们有一个x86的风味在引入一个library,而library中存在同样的风味维度,但是没有相同产品风味,这样会导致没法匹配,此时,就需要用这个参数。代码如下:
app下的build.gradle
android{//其他配置 flavorDimensions('abi')//创建产品风味productFlavors{x86{dimension'abi'matchingFallbacks=['pro']}}dependencies{ //引入flavor_x86libraryx86Implementationproject(':flavor_x86')}flavor_x86下的build.gradle
zincPower{multiDexKeepFilefile('multidex-config.txt')...}multidex-config.txt中的书写则如下,每一个文件则为一行
com/example/MyClass.classcom/example/TestClass.class2.11multiDexKeepProguardzincPower{multiDexKeepFilefile('multidex-config.pro')...}multidex-config.pro中的写法如下
(1)我们需要先在项目根目录下创建一个keystore.properties文件,在文件中写入对应的配置,如图所示(2)在应用级的build.gradle中使用如下代码
Stringname=BuildConfig.name;intage=BuildConfig.age;
值的一提的是,我们设置String类型的参数时,需要加上""双引号(如例子中的name属性)。切记!
zincPower{consumerProguardFile('consumer-rules.pro')}3.3consumerProguardFiles(proguardFiles)zincPower{consumerProguardFile('consumer-rules.pro','zincPower-rules.pro',.....)}3.4maxSdkVersion(maxSdkVersion)zincPower{//最高支持28版本minSdkVersion28}3.5minSdkVersion(minSdkVersion)zincPower{//最低支持19版本minSdkVersion19}3.6missingDimensionStrategy(dimension,requestedValue)我们的项目结构如下在zinclibrary的build.gradle中编写了如下渠道配置
//创建风味维度flavorDimensions('zinc','handsome')//创建产品风味productFlavors{minApi13{dimension'zinc'}minApi23{dimension'zinc'}x86{dimension'handsome'}arm64{dimension'handsome'}}此时如果直接在app的build.gradle中添加依赖,同步时便会出错
dependencies{...忽略其他依赖implementationproject(":zinclibrary")}所以我们需要在app的build.gradle中使用这个参数进行忽略library中带来的维度和风味,即使用如下代码