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

Android开发,关于aar你应该知道的的更多相关文章

  1. 关于Android的.so文件所须要知道的

    早期的Android系统差点儿仅仅支持ARMv5的CPU架构,你知道如今它支持多少种吗?7种. Android系统眼下支持以下七种不同的CPU架构:ARMv5.ARMv7 (从2010年起),x86 ...

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

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

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

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

  4. 【我的Android进阶之旅】快速创建和根据不同的版本类型(Dev、Beta、Release)发布Android 开发库到Maven私服

    前言 由于项目越来越多,有很多公共的代码都可以抽取出一个开发库出来传到公司搭建好的Maven私服,以供大家使用. 之前搭建的Maven仓库只有Release和Snapshot两个仓库,最近由于开发库有 ...

  5. 在开发第一个Android应用之前需要知道的5件事:

    你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的 ...

  6. Android开发人员应该知道的Kotlin

    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/01/kotlin-android Android开发人员在语言限制方面面临着 ...

  7. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  8. 对于JavaScript的函数.NET开发人员应该知道的11件事

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...

  9. 打造高质量Android应用:Android开发必知的50个诀窍

    打造高质量Android应用:Android开发必知的50个诀窍

随机推荐

  1. UVa 11586 - Train Tracks

    题目:给你一些积木碎片,每一个碎片的两端仅仅能是凸或凹(M或F).凸凹可拼起来.是否能拼成一个环. 分析:图论.欧拉回路.推断入度等于出度就可以,即M和F同样且大于1组. 说明:╮(╯▽╰)╭. #i ...

  2. 关于SAP S4 HANA 的13个问题

    SAP S/4HANA的路线图是怎样的?价格是多少?下一步还将添加哪些新模块?莫不闻专业SAP问答平台结合SAP HANA及SAP HANA应用商务套件开发全球负责人Uwe Grigoleit帮大家整 ...

  3. (转)Ubuntu10.04编译FFmpeg

    刚开始安装折腾了好久,很多软件包都找不到,可能是跟软件源有关,所以先说一下我的软件源: 软件源是用的中国默认的官方源http://cn.archive.ubuntu.com/ubuntu/ 一.安装编 ...

  4. SQL Server分区表,能否按照多个列作为分区函数的分区依据(转载)

    问: Hi, I have a table workcachedetail with 40 million rows which has 8 columns.We decided to partiti ...

  5. NiFi汉化

    ①在源文件中的 source-nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src中修 ...

  6. IC卡、ID卡、M1卡、射频卡的区别是什么【转】

    本文转载自:https://www.cnblogs.com/najifu-jason/p/4122741.html IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC ...

  7. elementaryos必装软件

    所使用版本:elementaryos-0.4-stable-amd64.20160909.iso vmtools jdk sougouinput IntellijIEAD

  8. BZOJ 4582 [Usaco2016 Open]Diamond Collector:贪心【相差不超过k】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4582 题意: 给你n个数. 让你将其中的一些数放入两个不同的集合中,并保证同一集合内两两元 ...

  9. druid相关的时间序列数据库——也用到了倒排相关的优化技术

    Cattell [6] maintains a great summary about existing Scalable SQL and NoSQL data stores. Hu [18] con ...

  10. vim 编辑器IDE版

    wget https://raw.github.com/ma6174/vim/master/setup.sh -O ma6174_vim_setup.sh && bash ma6174 ...