添加aar依赖的过程

关于Gradle的classpath和implementation

classpath位于全局文件build.gradle的buildscript{}中的,是gradle构建时的依赖,通常是各种tools;

implementation位于各模块build.gradle的dependencies{}中,是项目代码打包时的依赖,而且是隐藏式的依赖,即A依赖B,B依赖C,A是不能直接访问到C;

关于aar

jar是Java Archive File,是java的归档文件,是一堆.class文件的zip压缩包,不包含res等图片资源文件;

aar是Android Archive的缩写,Android库项目的二进制归档文件,表示其本身就是一个android项目,也是zip压缩包,除class.jar之外,还可能包含res资源文件,AndroidManifest.xml,R.txt之类。

jar的引入非常方便,在模块中创建libs目录,将jar放置其中,然后在在模块build.gradle的dependencies{}里添加:

implementation fileTree(dir: 'libs', include: ['*.jar']

这样就可以了,而且如果项目打包结果是aar,集成到其他项目中时就不再需要添加这些jar包了。

aar的引入就复杂得多,早期采用flatDir的方式,也是创建libs,然后将aar放置其中,build.gradle里添加:

repositories {
    flatDir {
        dirs 'libs'
    }
}

然后implementation语句改成如下(以oppo推送、小米推送为例子):

implementation(name: 'com.heytap.msp_3.4.0', ext: 'aar')
implementation(name: 'MiPush_SDK_Client_5_9_9-C_3rd', ext: 'aar')

但这样的写法在后来(大约gradle7.0以后吧)就会报个警告:

WARNING:Using flatDir should be avoided because it doesn't support any meta-data formats.

而且这样的引入会带来一个麻烦的问题:如果项目目标是生成一个aar,那么所有引入该aar的项目需要把其依赖的aar也引入进去。也就是说打包的aar不会把依赖的aar也包含进去。

自建nexus仓库

最好的引入aar的办法还是上传到自建仓库里,当然也可以传到本地仓库(其实就是保存到自己电脑的~/.m2/repository/),但自建nexus确实会解决这统统的所有问题:1. 不会有各种warning;2. 多人开发时容易共享,方便打包机自动化打包;3. 不用建那么多模块,网上很多方案都是建一个空module来依赖以解决aar的引入。

有时候我们只有一个aar,并没有pom文件,此时上传aar到nexus时就需要勾选上自动生成pom。pom是对aar的版本、名称、依赖库的描述文件。

如上图所示,直接上传aar文件后,扩展名写aar。group id、artifact id、version可以随便写,然后勾选自动生成pom。这样引入该aar就是:

repositories {
    maven {
        //自建的仓库地址
        url 'http://example.com:8087/repository/maven-public/'
        allowInsecureProtocol = true
    }
}

dependencies {
    implementation 'com.example:mipush:5.9.9@aar'
}

特别注意:

如果是:apk 依赖 aar A 依赖 aar B,那么在apk的build.gradle里需要同时添加aar A和aar B的依赖,如上面介绍的aar并不会将依赖的aar打包进自身;

如果是:flutter apk 依赖 plugin A 依赖 aar A 依赖 aar B,那么只需要在插件中添加aar A和aar B的依赖,flutter apk自动会将插件的依赖合并到项目再打包;

理论上将aar B这一依赖描述在aar A的pom里,可以不需要在apk中配置aar B,但还没有仔细学习pom的写法,待未来验证。

发表于 2023年11月23日 16:36   评论:0   阅读:984  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo