###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