Android productFlavors多渠道 打包
一、不同渠道引用不同 dependencies方法如下build.gradle文件所示1.先定义productFlavors 渠道channelA和channelB2.然后通过getTaskNames 获取当前编译的渠道,并赋值给变量 channel3.dependencies 中判断当前 channel 依赖不同的mudule或者jar--------------------build.gradle文件def channel gradle.startParameter.getTaskNames().each { task -if (task.toLowerCase().contains(channelA)) {channel channelA} else if (task.toLowerCase().contains(channelB)) {channel channelB}}android {productFlavors {channelA {buildConfigField(String, PROJECT_NAME, \channelA\)versionCode rootProject.ext.android[versionCode]versionName rootProject.ext.android[versionName]}channelB {buildConfigField(String, PROJECT_NAME, \channelB\)versionCode rootProject.ext.android[versionCode]versionName rootProject.ext.android[versionName]}}}dependencies {println(**********channel: channel)if (channel channelA) {//依赖不同的module} else if (channel channelB) {//依赖不同的module}}--这样做代码编辑模式下识别不到引用的包只有编译时才可以识别到引用的包可以做如下修改例如implementation androidx.appcompat:appcompat:1.2.0//如果只是channelA渠道引用该jar 可以改成channelAImplementation androidx.appcompat:appcompat:1.2.0这样就可以做到不同渠道引用不同的modulejar或aar了二、多渠道重命名输出apk例如在build variant 选择 versionCode1Abi1releasevariant.baseName为 versionCode1-abi1-release生成的apk名称为myapp-versionCode1-abi1-release.apk-------build.gradle文件配置如下android {flavorDimensions(versionCode, abi)productFlavors {versionCode1 {dimension versionCode}versionCode2 {dimension versionCode}abi1 {dimension abi}abi2 {dimension abi}}android.applicationVariants.all { variant -variant.outputs.all {println(**********applicationVariants variant.baseName: variant.baseName)def appName myappoutputFileName appName - variant.baseName .apkprintln output app : outputFileName}}}三、风味渠道缺失默认匹配例如 如果app 定义的 了flavorDimensions demoproductFlavors {flavor1 {dimension demo}flavo2 {dimension demo}}在其他module中没有定义可以定义匹配的的风味渠道可以通过missingDimensionStrategy 默认匹配missingDimensionStrategy demo, flavor1注意这里只要写一个flavor1就可以了不要写成missingDimensionStrategy demo, flavor1, flavor2因为最终 App 会覆盖它所以选哪个都无所谓纯粹是让 Gradle 编译时不报错。一句话总结Library 模块的 missingDimensionStrategy编译必须写运行时不生效。App 模块的 missingDimensionStrategy编译必须写运行时也生效。可以理解为 missingDimensionStrategy 对 library 模块来说是给 Gradle 的一个占位声明——告诉编译器我知道我缺少维度先按这个选但最终 App 作为顶层模块会统一拍板