[转]AAR 内部三方库依赖的问题

7,003 阅读2分钟

项目的开发过程中,发现一个问题:

使用 Android Studio 打包出来的 AAR ,不会将其依赖的三方库打包进去。

举个例子,library Test 依赖了 okhttp,打包成了 Test.aar ,app 使用本地方式引用了 Test.aar,但是无法使用 okhttp,为了不报错,app还需要添加 okhttp 依赖。

Google Android Studio 的负责人在 stackoverflow 上解释了 为什么 Android Studio 不能将多个依赖打包进一个 AAR 文件的原因,是因为将不同的library打包在一起,涉及到资源和配置文件智能合并,所以是个比较复杂的问题,同时也容易造成相同的依赖冲突。

官方虽然不支持,但是开发者的能力是无限的,为了解决此问题,开发出来了一个 Gradle 插件 android-fat-aar, 这种方式是抛弃 Android Studio 自带的打包 AAR 的方法,而是自己编写一个生成 AAR 的脚本。也是很厉害了,但是很不幸,目前来看 gradle 2.2.3+ 以上,这个就不适用了。

不过,不要慌,这个问题可以通过使用 Maven 依赖解决。因为 library Module 上传 Maven 后,会生成 一个 .pom 文件,记录 library Module 的依赖。当 Gradle 依赖 Maven 上的这个库时,会通过 pom 文件下载对应依赖。如果不想要对应依赖的话,可以通过下面的方法关闭 Gradle 的依赖传递。

举个例子如下:

//正常依赖
implementation 'com.chemao.android:chemao-sdk:1.2.3'

//关闭全部依赖传递-方法1
implementation 'com.chemao.android:chemao-sdk:1.2.3@aar'

//关闭全部依赖传递-方法2
implementation('com.chemao.android:chemao-sdk:1.2.3') {
        transitive = false
}

引用:drprincess.github.io/2018/01/31/…

回到我们的某业务基础包的问题。因为依赖了okgo,okrx2,okserver,三个都要引用,如:

implementation('cacheh5.example.com:cacheh5sdk:1.1.0@aar')//某业务基础包,放公司私服
implementation('cacheh5.example.com:cacheh5okserver:1.0.0@aar')//三方库有源码修改,放公司私服
//implementation 'com.lzy.net:okserver:2.0.5' //三方原库,用上面修改的替换了
implementation 'com.lzy.net:okgo:3.0.4'//三方库
implementation 'com.lzy.net:okrx2:2.0.2'//三方库

另外一直不推荐的方法,把修改后的okserver源码拷贝到cacheh5sdk同一个Module下,也能解决问题,缺点:减低了代码耦合度。