Android开发,关于aar你应该知道的
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
,选择
ModuleAndrod
>
LibraryNext
,指定Library
Name和Module Name。
新建的Library与正常的Application最大区别是module build.gradle中是apply plugin: ‘com.android.library’ 而不是 apply plugin: ‘com.android.application’.
Build
> Make
(⌘F9),自动生成aar文件。
project
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中添加
12345repositories {flatDir {dirs 'libs'}}
flatDir
repositories用来声明文件目录做为依赖库,’libs’路径是build.gradle的相对路径,目录名称可以任意,也可以同时声明多个dirs。
- 在Application Module/build.gradle中添加依赖
123dependencies {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你应该知道的的更多相关文章
- 关于Android的.so文件所须要知道的
早期的Android系统差点儿仅仅支持ARMv5的CPU架构,你知道如今它支持多少种吗?7种. Android系统眼下支持以下七种不同的CPU架构:ARMv5.ARMv7 (从2010年起),x86 ...
- 关于Android开发中Arm、X86和Mips(草稿)
一.架构 1.Arm架构 是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计. 2.X86架构 是一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合 ...
- 史上最全的Android开发学习教程集锦【初学者】
根据Google的报告,截止2017年5月为止,Android活跃用户已超过20亿,并还在持续增长中.Android系统在几个主要的市场上已超过了iOS系统,特别是在美国,欧洲和日本,然而苹果确实在中 ...
- 【我的Android进阶之旅】快速创建和根据不同的版本类型(Dev、Beta、Release)发布Android 开发库到Maven私服
前言 由于项目越来越多,有很多公共的代码都可以抽取出一个开发库出来传到公司搭建好的Maven私服,以供大家使用. 之前搭建的Maven仓库只有Release和Snapshot两个仓库,最近由于开发库有 ...
- 在开发第一个Android应用之前需要知道的5件事:
你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的 ...
- Android开发人员应该知道的Kotlin
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/01/kotlin-android Android开发人员在语言限制方面面临着 ...
- Android 程序员必须知道的 53 个知识点
1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...
- 对于JavaScript的函数.NET开发人员应该知道的11件事
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...
- 打造高质量Android应用:Android开发必知的50个诀窍
打造高质量Android应用:Android开发必知的50个诀窍
随机推荐
- java中的clone方法
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- Java语言基础(回头复习)
/* 使用变量的时候要注意的问题: A:作用域 变量定义在哪个大括号内,它就在这个大括号内有效. 并且,在同一个大括号内不能同时定义同名的变量. B:初始化值 没有初始化值的变量不能直接使用. 你只要 ...
- Python爬虫一些操作headers与cookies的便捷工具
本篇文章主要是爬虫中常用的便捷处理方法整理,转载请注明出处 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-08-14 13: ...
- 基于ajax和Form实现的注册
注册 urls.py from django.contrib import admin from django.urls import path, re_path from app01 import ...
- python的join()函数
def join(self, iterable): # real signature unknown; restored from __doc__ """ S.join( ...
- js/html/css做一个简单的图片自动(auto)轮播效果//带注释
FF(firefox)/chrom/ie稳定暂无bug...注意:请自己建立一个images文件,放入几张900*238的图片(注意图片格式和名字与程序中一致). 1. [图片] 1.JPG 2. [ ...
- 使用libcurl,根据url下载对应html页面
1. [图片] Capture.JPG 2. [代码]GetPageByURL //static member variable definestring GetPageByURL::m_curPa ...
- ThinkPHP基础(1)
多层MVC模式 M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 控制器访问及路由解析 通过url地址get参数找到指定的控 ...
- malloc和new的区别是什么?
http://zhidao.baidu.com/link?url=iUDUZeJtj1o12PvUETLlJgvAMqzky5HxGCJRGnULpsO8HdWAdjKkQqGCJ9-o-aTu8NP ...
- 初识Spacy
之所以想接触Spacy,是看到其自称为工业级的应用,所以想尝试下 windows下安装Spacy: 直接安装pip install spacy是会报错的 解决方法: 到 htt ...