Android
aar
1. 简述
Gradle的一些基本依赖配置方式如下:
-
compile fileTree(dir:'xxx',include:['*.jar','*.xxx'])
: 将某个目录下所有符合扩展名的文件作为依赖 -
compile 'com.xx.xx:ProjectName:Version'
:配置Maven库为依赖 -
compile project(':otherModule')
:配置另一个module作为本Module的依赖,被依赖的Module必须被导入到当前工程中 -
compile file('xxx.jar')
: 配置某个jar包作为依赖
2. AAR文件简介
假如我们希望提供一个带有资源文件的第三方库给别人使用,总不能直接把源代码给别人,但是我们知道eclipse打包的时候不能包含res的资源文件,于是Android在发布Android studio的时候就发布了一种独有的格式AAR,专门用于打包UI组件库。与jar相比其多了一些UI组件用到的属性、图片等一系列文件,它的好处在于你不需要再多创建一个Library Module,只需引用这个AAR文件即可,Android Sudio会自动把AAR包里的文件跟你的项目融合。
要输出aar文件,必须将Module配置为library,在gradle文件中如下:
- 要输出 aar:
apply plugin:'com.android.library'
- 要输出 apk:
apply plugin:'com.android.application'
3. 打包生成 aar
将 Module 配置为 library 后,构建输出一个 aar 文件,根据渠道和 BuildType 的不同,在相应的目录下可以找到。比如对 BuildType 为 debug 的配置,输出为:[ModuleName]/build/outputs/aar/[ModuleName]-debug.aar
。一份 aar 文件其实就是一份 zip 包,和 jar 不同的是,它将一些资源文件、第三方库文件、so 文件等等都打包在内,而代码文件编译后压缩在classes.jar
中。
4. 使用配置依赖的方式引用
-
首先需要将 aar 文件放入引用Module的libs目录下,和一般的jar文件类似;
-
然后在gradle配置文件中把libs 目录放入依赖:
repositories{ flatDir{ dirs 'libs' } }
-
在gradle文件中使用依赖的方式引用aar,这一句依赖即可关联完毕:
compile(name:'xxx',ext:'aar')
-
重新构建一下工程,在Module的
build/intermediates/exploded-aar
目录下,既可以看到导入的aar生成的临时文件。
参考文献:
网友评论
https://developer.android.google.cn/studio/projects/android-library.html
repositories {
flatDir{
dirs 'libs'
}
}
1. 编译后自动会在build/outputs/aar目录下生成.aar文件。此aar仅打包了Library工程的class、libs和资源文件,但Library引用的其他库(比如compile “com.squareup.okhttp3:okhttp:3.4.1”)并未包含在aar中。使用Library时还需把它引用的库再手动声明一遍,差评!
2. 发布到本地Maven库(或jCenter、MavenCentral)。发布出来的内容除了aar还包含了Library的所有dependencies信息。使用时直接设置好maven库地址,声明引用Libraray,gradle就会帮你自动引用Library中嵌套引用的所有dependencies了。
1. http://stackoverflow.com/questions/22795455/transitive-dependencies-not-resolved-for-aar-library-using-gradle?rq=1,这里提供了一个解决方法,添加transsitive=true属性,但是我尝试后发现还是出现运行时错误
2. http://stackoverflow.com/questions/36473906/gradle-download-dependencies-of-included-aar-library?rq=1,这里面的方法我觉得是正确的解决方案,但是我没有使用maven repository尝试。在新项目中声明aar模块使用的依赖这种方式是可以解决的。因为arr中不包含描述依赖的pom文件,所以导致classNotfound的错误,
希望回答能对你有点启发。