背景:项目用到了三个功能A,B,C, 选型 筛选出 三款的SDK,(AA,BB,XX)
实际应用中,可能功能A 用到了AA家的,B 用的是BB家的,C用的是XX家的
也可能是A,B,C功能都用的是一家的。
三家的SDK都被封装成单独的模块,可供主工程调用。
最初的做法是,根据用到的SDK,手动添加||注释 对应的模块。
然后代码里手动的配置常量,指定什么功能使用谁家的SDK
弊端:不灵活,期望能动态的去依赖对应的模块
于是开始查资料,开始关键字是productFlavors
发现方向不对,那个是按渠道打对应的包,我这需求是打一个包
继续找,
发现有可以在dependencies中通过判断语句来实现
代码如下
dependencies {
if (rootProject.ext.Case== ("AA")) {
implementation project(':AA')
} else {
//....
}
}
但考虑到具体场景,有可能某SDK被引入多次,虽然无碍大局,但总归不太合理。
于是继续找,
想起 Set 可以 去重, 但是在gradle 文件的语法该怎么写?
先试试Java的写法
ext{
A = "aa"
B = "bb"
C = "xx"
sdkfun = new HashSet() ;
sdkfun.add(A)
sdkfun.add(B)
sdkfun.add(C)
}
接下来是在应用gradle文件中去写依赖了
dependencies {
rootProject.ext.voicefun.each {
api project(':' + it + 'module') //'module'是工程后缀名称
}
}
能用~。
还有个问题,怎么在配置文件中配置参数供APP调用呢。
也不复杂
android {
defaultConfig {
//三个参数 第一个是类型,第二个是变量名称,第三个是值
buildConfigField("String", "A", rootProject.ext.A)
buildConfigField("String", "B", rootProject.ext.B)
buildConfigField("String", "C", rootProject.ext.C)
}
}
编译完成后
应用目录下
build/generated/source/buildConfig/debug/packageName/
路径下的 BuildConfig 中 即可看到对应的 变量。
(这个BuildConfig文件是java类型,我最初以为是Class的)
收工。