美文网首页android学习笔记
记一次项目gradle动态依赖

记一次项目gradle动态依赖

作者: heheworld | 来源:发表于2021-03-12 17:12 被阅读0次

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

    收工。

    相关文章

      网友评论

        本文标题:记一次项目gradle动态依赖

        本文链接:https://www.haomeiwen.com/subject/ibmzqltx.html