前言:
up的工作是对接硬件的,所以每次上面丢过来一台设备,我就要适配同样的功能;终于在一次次对接后,apk膨胀到了200M的大小。
更头疼的事情是,遇到同一个厂家两代不同的设备,但是 SDK 的包名结构是一模一样的,直接当场运行不下去了。
于是我开始思考,如何将实现,用一份代码,通过不同渠道依赖不同的SDK的方式去适配,解决我手头上遇到的问题。
先将我的思路摆出来,跟着思路往下走
-
设想的架构
将通用的 API,通过接口的方式暴露给 业务module; 将不同厂家的sdk都放到 子module中; 业务 module根据不同的渠道,去通过反射的方式去创建对应的接口实现类;
-
现实的苦楚(业务代码拆分不开)
上面的设想很丰满,但是现实却很骨感;之前的代码已经将业务和SDK 功能耦合到一起了,拆分的工作非常难顶。
-
解决不同渠道依赖不同 sdk 的问题 正题,如何解决不同渠道依赖不同 SDK 的问题
我们在集成LeakCanary 的时候,我们用的依赖方式 是通过debugImplementation实现的
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'针对渠道包,同样的也可以用改方式去实现某些渠道依赖不同的内容,举个例子,比如我们去将百度的渠道做一个区分,那么完全可以通过配置渠道,然后baiduImplementation的方式去表示,百度渠道包使用下面得内sdk
baiduImplementation(project(":baidu"))需要注意的是,在编译百度渠道的apk时,需要切换一下编译项,这样才能确保编译没有问题。
-
解决编译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的文件名,
然后每个aar文件,我们单独建立一个文件夹,用于标注一个aar
将aar文件丢到这个文件夹
在该文件目录下创建build.gradle文件,并进行配置
在settings.gradle中进行配置
include ':localAar:baidu'在功能 子module 中,依赖该aar
dependencies { implementation project(path: ':localAar:baidu') }大工告成!!!