https://yangbo.tech/2015/10/17/all-about-aar/

背景

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

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。

新建的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

最新文章

  1. Android自定义控件之基本原理
  2. IE兼容forEach/map/every/some/indexOf/filter
  3. unity3d插件Daikon Forge GUI 中文教程5-高级控件listbox和progress bar的使用
  4. KMP算法浅析
  5. 通过blktrace, debugfs分析磁盘IO
  6. Hacker(20)----手动修复Windows系统漏洞
  7. C语言获取系统当前时间转化成时间字符串
  8. JavaSE学习总结第14天_API常用对象4
  9. Hadoop Security Authentication Terminology --Kerberos
  10. empty 和isset的差别
  11. 201521123010 《Java程序设计》第7周学习总结
  12. Levenshtein Distance + LCS 算法计算两个字符串的相似度
  13. JS中的一元操作符
  14. 三,APIView、GenericAPIView、Mixins总结
  15. Windows核心编程:第7章 线程调度、优先级和关联性
  16. 03-创建高可用 etcd 集群
  17. mysql处理varchar类型的between和and的时间问题少一天解决;
  18. 如何Python写一个安卓APP
  19. 网桥 以及 IEEE802.1D 生成树协议
  20. mybatis如何根据mapper接口生成其实现类

热门文章

  1. Bitmaps
  2. PAT 甲级 1005. Spell It Right (20) 【字符串】
  3. 安装wampserver 计算机丢失msvcr100.dll
  4. ffmpeg 调试
  5. 如何用命令行删除EasyBCD开机选择项?
  6. BZOJ 1601 [Usaco2008 Oct]灌水:最小生成树
  7. __declspec(dllimport)的小秘密(转)
  8. c# json 排版
  9. linux网络编程 gethostbyname()
  10. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心