公司最近让我输出一个支付sdk给到三方公司集成,这个sdk其实已经在我们公司的私有库里了,我们自己平时开发的时候就直接在gradle里依赖sdk的仓库地址就能用,但是地址不想暴露给第三方,所以需要打成离线的aar包给出去。
这时候就会遇到一个问题,那就是aar离线包打出来后是不包含它的依赖库的,我们的支付sdk依赖了好几个公司的其他的库a,b,c(远程依赖),所以需要把这些依赖的库的jar包打进aar里,这样才是一个完整的sdk。
几经思考后,本来想手动把a,b,c那几个库编译成jar放到aar的lib里,但是找到那些a,b,c库一看他们又分别依赖了公司另外的几个库d,e,f,顿时头大了,真要自己一个个手动编译就头大了,后来在网上找了一圈发现一个插件是解决这种难题的完美方案。就是fat-aar(胖子aar),GitHub地址:
https://github.com/kezong/fat-aar-android/blob/master/README_CN.md
该插件提供的功能主要是帮我们把sdk的依赖库集成到aar里,使用上还需自行灵活选择哪些依赖库需要集成进aar,哪些不需要,比如我在打完全量依赖的aar后(配置transitive为true,只embed标记公司的库依赖,三方库不打标记)就发现会出现很多类/模块重复,一看都是官方的一些库文件,原因是全量打包会把所有支付Sdk里embed标记的库依赖的依赖(树结构遍历一直到底)都集成进aar,这样肯定会出现很多重复的模块/类。
所以后来又打了一个只引入直属依赖jar包的aar((配置transitive为false,也是只embed标记公司的库依赖,三方库不打标记),这样就只会把支付Sdk里的embed标记依赖库集成进aar,而不会继续遍历下去集成更底层的依赖,如此确实解决了模块/类冲突的问题,但是因为没有把所有的依赖集成进aar,使用的时候会报很多ClassNotFound的错误。
aar里的目录结构
在这里卡了很久,虽然知道问题原因,但是处理起来着实麻烦,好在fat-aar插件打包aar的时候把大部分直属/公司库依赖都是放在classes.jar里,而很多知名三方/android官方依赖放在libs目录下,如此,我便想到可以把全量aar里的classes.jar文件里的com包(里面大都是公司的依赖jar)复制替换掉直属依赖aar包里面的com包,删掉android和androidx包,最后使用修改过的直属依赖aar放到demo工程libs里跑起来后,还是报了一些知名三方库(retrofit,gson等)没有找到的错误,这都是预期会出现的问题,在demo里重新依赖一下即可。
classes.jar里面正确的目录结构
aar就是一个文件集成,只要保证结构完整,可以放心的增删里面的模块。
到此,我们提供的支付Sdk的aar包里面包含的基本是我们公司自己的库相关集成,知名的三方库让使用者自行添加依赖即可,这样对集成方也更友好,因为他们自己的工程很多可能会自行集成那些知名三方库,这样就不会出现包名/类冲突的问题,但是需要集成哪些知名 三方库需要告知集成者。(期间遇到因为公司加密系统导致360压缩编辑aar和jar包时损坏文件,后面改用rar压缩解决了问题)
网友评论