转载自:http://alphayang.community/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的清单文件

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

  • 检查最终的AndroidManifest.xml
  • 检查合并报告(app\build\outputs\logs\),日志文件的格式和内容

后记

本文中所用的项目代码托管在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

Android开发,关于aar你应该知道的相关推荐

  1. 代号Pie!Android 9.0那些开发者必须知道的事

    北京时间2018年8月7日,Google官方发布了Android 9.0版本,代号为Pie.没有发布会,也没有其他仪式,尽管Google之前已经对Pie 做了不少预热工作(比如在中国国内四五月份就有一 ...

  2. activex for chrome扩展程序 下载”_提升前端开发效率:你应该知道的10个Chrome扩展程序...

    作者 | Chidume Nnamdi 译者 | 王强 策划 | 李俊辰 "进步不是勤奋者的功劳.它是懒惰者在尝试寻找更简单的方法时取得的成果."  --罗伯特·海因莱因 CSSV ...

  3. 软件开发必修课:你该知道的GRASP职责分配模式

    简介:软件开发为什么需要职责驱动设计(RDD)?职责应该如何分配?如何结合架构模式在实际开发中实践落地?本文介绍一种通用的职责分配模式--GRASP,通过举例详解GRASP的几大原则,并分享两个实际运 ...

  4. 想从iOS转移到Android阵营?这里有你必须要知道的

    最近我决定放弃我的iPhone,并选择买一部HTC One X手机,这就好像我跑到了"敌后"根据地一样.如果你同我一样对苹果公司近期政策和缺乏创新性感到沮丧,那么这篇文章将教你如何 ...

  5. 【开发环境系列】关于conda管理Python开发环境,你需要知道的事

    如何使用conda 安装Miniconda 从Miniconda官方网站下载Miniconda Py3.6, Win_64bit版本 或者Py3.6, Win_32bit版本 Py2.7, Win_6 ...

  6. WMS开发前要知道的10大关键点

    导语 大家好,我是智能仓储物流技术研习社的社长,你的老朋友,老K. 知识星球 * 原创电子书 * 深海社区 * 微信群 现代供应链需求对仓库管理系统(WMS)形成了一系列复杂而又严格的要求,并且面临的 ...

  7. 关于Android开发中Arm、X86和Mips(草稿)

    一.架构 1.Arm架构 是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计. 2.X86架构 是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合 ...

  8. 史上最全的Android开发学习教程集锦【初学者】

    根据Google的报告,截止2017年5月为止,Android活跃用户已超过20亿,并还在持续增长中.Android系统在几个主要的市场上已超过了iOS系统,特别是在美国,欧洲和日本,然而苹果确实在中 ...

  9. 每一位Android开发者应该知道的Android体系架构和开发库

    Android的体系架构鼓励组件重用,允许开发者发布共享Activity.Service并且访问其他应用程序的数据,还可以根据开发者制定的安全限制进行管理.话虽如此,今天我将分享一些关于Android ...

最新文章

  1. Mysql共享锁实例_mysql共享锁与排他锁用法实例分析
  2. 【计算理论】自动机 示例 ( 自动机示例 | 自动机表示方式 | 自动机计算流程简介 )
  3. CTFshow 文件包含 web82
  4. pat数素数 20 c语言,PAT乙级C语言1013 数素数
  5. pytorch实现常用的一些即插即用模块(长期更新)
  6. 不要错过!MICCAI 2019 所有论文完整下载
  7. Windows server 2012 r2更新
  8. 从 RequireJs 源码剖析脚本加载原理
  9. VMware安装系统时“无法创建新虚拟机: 不具备执行此操作的权限“的解决方案
  10. Android Material Design调色板
  11. Ubuntu 11.04上安装jdk1.6+oracle 11g笔记
  12. 计算机王码简历,王码五笔字型发明人王永民回首汉字输入这30年
  13. 【精选】那些莫名其妙但又不得不服的经济学/社会学/心理学著名定律/效应
  14. 怎样在服务器找回网站后台密码,宝塔面板忘记后台账号密码怎么找回 一条命令轻松搞定...
  15. Android编译内核并刷入
  16. Android 极光推送 自定义通知铃声
  17. Java面试宝典之:基础篇
  18. PXC 安装 (yum操作)
  19. 计算机与汽车智能信息化管理,谈计算机控制系统在汽车行业的应用
  20. python request 爬虫爬取起点中文网小说

热门文章

  1. TinyXml Documentation 翻译 TinyXML Tutorial翻译
  2. IO流全面解析(含NIO部分说明)
  3. 基于Skip-Thought的Sentence2Vec神经网络实现
  4. App自动化环境配置及安装
  5. 什么是final、static和static final?
  6. ue4 GameUserSetting的使用(设置分辨率,全屏模式,帧率,垂直同步等)
  7. 用友UAP/NC,今天做表体的编辑后事件
  8. Flask快速入门,知识整理
  9. P1022 计算器的改良 (模拟)
  10. 个人笔记——PointNet++初读