Android aar类库使用中的那些坑
我们一般都是使用别人写的aar,很少会自己写,实际上将复用代码打包成aar发布还是很有必要的。
本篇文章主要记录在封装aar过程中遇到的一些坑。
官方文档
官方文档连接
简单的东西不介绍,自己看吧,重点需要注意的一些点。
私有资源
默认aar的所有资源都是pubic的,如果希望指定某些资源是private,
需要通过在/res/values/public.xml中指定对外提供的public资源。
这样未指定的资源,外部如果使用使用到了私有资源,会在编译时,在lint中提示。
参考资料
resource合并
- 构建工具会将lib中的resource合并到app中。如果app同lib中有相同ID的资源,
则只保留app中的资源。 - 如果依赖的多个aar中包括相同的资源,则会根据依赖列表中,lib的位置顺序来使用资源。
比如依赖A,B两个lib,A在依赖列表的第1行,B在依赖列表的第2行。
则会使用A中的资源,而不使用B中的资源。
为了避免资源冲突,对lib中的resource使用独特的前缀,避免资源冲突
raw assets
lib不能包含assets目录。如果需要使用assets中的资源,需要在app中添加相关资源。
minSdkVersion
lib中的是有minSdkVersion字段的,使用该lib的app,的minSdkVersion必须要大于等于lib中的定义。
R文件
每个aar都会对应自己的R文件。规则为package name + R.class
混淆
aar可以将proguar配置文件包含到包中,需要在lib的build.gradle中添加如下配置
android {
defaultConfig {
//保证app使用lib时,会自动将该proguard文件添加到本身的proguard规则中
consumerProguardFiles 'lib-proguard-rules.txt'
}
}
添加该配置后打出来的aar包会包括proguard.txt.注意无论原proguard文件的名字是什么,
打成aar后,aar包中的名字都是proguar.txt.该配置会自动添加到app中,不需要app再手动添加混淆文件。
多版本aar包
指的是app在根据不同规则下,使用不同的aar包。
比如debug版本app使用debug版本的aar,release版本app使用release版本的aar。
debug,release只是两种预先定义的类型,我们可以自己添加新的构建类型。
需要注意如果不指定使用何种规则的包,默认会使用release的aar包。
如果需要实现该功能,需要在aar build.gradle中添加如下内容
android {
publishNonDefault true
}
在app build.gradle中按照如下规则配置
dependencies {
debugCompile project(path: ':library', configuration: 'debug')
releaseCompile project(path: ':library', configuration: 'release')
}
上面的例子表示,debug版本的app使用debug的aar,release的app使用release的aar。
需要注意的是,经过测试,使用分版本的方式指定aar build.gradle,在提交到nexus服务器之后,会导致app获取资源不对,比如,com.xxxxx.android:libxx:0.8 如果是从nexus获取,并且该aar在上传的时候添加了多版本支持,则app在获取该aar的时候会获取libxx.jar.而不是正常的获取,libxx.aar.
查看nexus pom文件,也没区别,相应的groupId,artifactId跟正常的也没区别。
只是对应的包会包含两个,分别为libxx-0.8-debug.aar和libxx-0.8-release.aar,
而不使用该配置提交的包为libxx-0.8.aar.
这是比较比奇葩的,也没有查到具体原因,如果知道的朋友,请留言告知下吧。
Android交流qq群号 29552133
微信交流群二维码