如何用一份代码通过渠道的方式去适配不同的SDK的解决方案

132 阅读2分钟

前言:

up的工作是对接硬件的,所以每次上面丢过来一台设备,我就要适配同样的功能;终于在一次次对接后,apk膨胀到了200M的大小。

更头疼的事情是,遇到同一个厂家两代不同的设备,但是 SDK 的包名结构是一模一样的,直接当场运行不下去了。

于是我开始思考,如何将实现,用一份代码,通过不同渠道依赖不同的SDK的方式去适配,解决我手头上遇到的问题。

先将我的思路摆出来,跟着思路往下走

  1. 设想的架构

    将通用的 API,通过接口的方式暴露给 业务module; 将不同厂家的sdk都放到 子module中; 业务 module根据不同的渠道,去通过反射的方式去创建对应的接口实现类;

  2. 现实的苦楚(业务代码拆分不开)

    上面的设想很丰满,但是现实却很骨感;之前的代码已经将业务和SDK 功能耦合到一起了,拆分的工作非常难顶。

  3. 解决不同渠道依赖不同 sdk 的问题 正题,如何解决不同渠道依赖不同 SDK 的问题

    我们在集成LeakCanary 的时候,我们用的依赖方式 是通过debugImplementation实现的

    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
    

    针对渠道包,同样的也可以用改方式去实现某些渠道依赖不同的内容,举个例子,比如我们去将百度的渠道做一个区分,那么完全可以通过配置渠道,然后baiduImplementation的方式去表示,百度渠道包使用下面得内sdk

    baiduImplementation(project(":baidu"))
    

    需要注意的是,在编译百度渠道的apk时,需要切换一下编译项,这样才能确保编译没有问题。

    image.png

  4. 解决编译Direct local .aar file dependencies are not supported when building an AAR.的问题

    解决定向编译问题后,我们愉快的进行debug包的编译,一切看起来都很美好,然而当我在编译release包的时候,AS抛出了irect local .aar file dependencies are not supported when building an AAR.的报错,提醒我不应该将一个aar放到一个library类型的module中。

    不啰嗦,直接上解决方案,需要将每一个aar文件,封装到一个字module中。

    在项目根目录下随便建一个文件夹,我这边取了localAar的文件名,

    image.png

    然后每个aar文件,我们单独建立一个文件夹,用于标注一个aar

    image.png

    将aar文件丢到这个文件夹

    image.png 在该文件目录下创建build.gradle文件,并进行配置

    image.png

    在settings.gradle中进行配置

    include ':localAar:baidu'
    

    在功能 子module 中,依赖该aar

    dependencies {
        implementation project(path: ':localAar:baidu')
    }
    

    大工告成!!!