android学习笔记

记一次项目gradle动态依赖

2021-03-12  本文已影响0人  heheworld

背景:项目用到了三个功能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的)

收工。

上一篇 下一篇

猜你喜欢

热点阅读