背景

在软件工程中,分治是最基本的设计原理,就如同现实中的砖、瓦、钢筋、水泥一样,模块化、组件化的分工,让我们整个软件世界变得井井有序,丰富多彩。

Java jar

在Java开发中,添加组件简单的以添加jar文件依赖为途径,jar有两个含义:

  • jar文件格式:Java Archive,就是zip文件格式,文件名后缀是jar,包含了java class,metadata,资源(文本、图片等)。
  • Java archive tool: JDK中的工具,用来生成jar包的工具。

jar在Android开发中的不足

在Android应用资源中,Java Source,Resouce以及所需的so文件和jar包,用jar格式可以很好的处理Java Source,但对于目录比较复杂的Android Res目录,二进制依赖so文件和jar包则显得的乏力。当你收到一个第三方SDK zip包,要添加到自己的项目中,解压后是一个jar包和一堆文件夹,不停的复制粘贴甚至解决冲突的时候,心里肯定开始不满意这血吸虫组件分发方式了。

aar

什么是aar

为了解决Android开发中组件引用的问题,引入aar格式。也是简单的zip格式。
定义:The ‘aar’ bundle is the binary distribution of an Android Library Project.
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)
    其中,R.txt是aapt –output-text-symbols命令的输出。

生成aar

在Android Studio1.4中,New project,先默认新建一个Applicaton module,接后File > New > New Module,选择Androd Library > Next,指定Library Name和Module Name。

new

新建的Library与正常的Application最大区别是module build.gradle中是apply plugin: ‘com.android.library’ 而不是 apply plugin: ‘com.android.application’.

Build > Make project(⌘F9),自动生成aar文件。

1
2
3
4
5
| build
| outputs
| aar
| mylibrary-debug.aar
| mylibrary-release.aar

使用aar

aar可通过以下三种方式引入到项目中:

  • 公共Maven仓库
  • 私有Maven仓库
  • 复制粘贴aar文件
    前两种引入方式涉及到Gradle发布Library到Maven,另文介绍。
    重点介绍第三种方式:
  • 把aar粘贴到要引入库的Application Module/libs目录下,如没有libs目录,创建就好。注意要在Application Module根目录下,不是Project根目录下。
  • 在Application Module/build.gradle中添加
    1
    2
    3
    4
    5
    repositories {
    flatDir {
    dirs 'libs'
    }
    }

flatDir repositories用来声明文件目录做为依赖库,’libs’路径是build.gradle的相对路径,目录名称可以任意,也可以同时声明多个dirs。

  • 在Application Module/build.gradle中添加依赖
    1
    2
    3
    dependencies {
    compile(name:'mylibrary-debug', ext:'aar')
    }

关于AndroidManifest.xml合并

在上文中看到aar文件中还包含了库中的AndroidManifest.xml文件,但是最终应用APK中只能有一个AndroidManifest.xml,就涉及到应用AndroidManifest.xml和所有库AndroidManifest.xml的合并。

合并顺序:

  • 1.与Produt flavors和build types指定的清单文件
  • 2.application module的主清单文件
  • 3.library module的清单文件

大多数情况下合并不会造成什么问题,如果发现合并后出现了问题:

后记

本文中所用的项目代码托管在github

引用

AAR File Format
http://tools.android.com/tech-docs/new-build-system/aar-format

Manifest merging user guide
http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger