###1. aar
传统的jar包只能打包class文件, 并不能打包android的资源文件, 在使用jar包来发布android的库时, 除了要提供jar包, 还要额外提供res文件,为此, android在推出了 “.aar”包(Android Archive)
简单来说, “.aar” 是一个包含如下的 文件/目录 的zip包
- AndroidManifest.xml (mandatory)
- classes.jar (mandatory)
- res/ (mandatory)
- R.txt (mandatory)
- assets/ (optional)
- libs/*.jar (optional)
- jni/
/*.so (optional) - proguard.txt (optional)
- lint.jar (optional)
###2. 使用Android Studio 打包 aar
在 Android Studio 中点击 “File” -> “New” -> “New Module”, 然后选择 “Android Library” 点击确定, 然后输入library名程, 点击确定即可
在 libraray 中建立所需的代码和资源文件后, 点击 “Build” -> “Make Module ’xxx‘”, 在工程目录中对应的 “<package name>/<library name>/build/outputs/aar/” 目录中, 即生成了对应的 aar包
###3. 在Android Studio 中引用 aar 包
以在Android Studio 中的名为“test” 的app project中引用名为 “aarlib.aar” 的aar包为例
首先, 将 “aarlib.aar” 包拷贝到 android 工程目录对应的 test/app/libs 目录中
然后在 Android Studio 的工程视图切换为 “Android”, 然后在工程视图中打开 build.gradle 文件
| -app
| |- ...
| |- ...
| |-
| |- ...
|
|-Gradle Scripts
|- ...
|- build.gradle (Module app)
在 build.gradle中添加如下行
android {
......
+ repositories {
+ flatDir {
+ dirs 'libs'
+ }
+ }
......
}
dependencies {
......
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile(name:'aarlib', ext:'aar')
......
}
然后点击 Android Studio 菜单栏下的 “Sync Project With Gradle Files” 图标, 即可在app中引用aar包中的资源和类
###4. 在 android 源码中引用aar包
android M 开始在源码的build系统中添加了对aar包的支持, 仍旧以在一个名为 ”test“ 的app中引用 aarlib.aar 包为例
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng debug
LOCAL_SRC_FILES := $(call all-java-files-under, java)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
#指定要预编译的aar包
LOCAL_STATIC_JAVA_AAR_LIBRARIES := myaar
LOCAL_PACKAGE_NAME := test
LOCAL_CERTIFICATE := platform
#指定要引用的aar包中的package name
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.whut3.sven.layoutlib
......
include $(BUILD_PACKAGE)
#定义预编译的aar包
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := mayaar:libs/aarlib.aar
include $(BUILD_MULTI_PREBUILT)
需要注意的是 “LOCAL_AAPT_FLAGS” 标志, 若不指定aar包的package, 则在引用aar保重的资源, 会出现类似如下的错误:
java.lang.NoClassFoundException : com.whut3.sven.layoutlib.R$layout
.....
java.lang.NoClassFoundException : com.whut3.sven.layoutlib.R$styleable