简述Android操作系统
Posted Css__ssC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简述Android操作系统相关的知识,希望对你有一定的参考价值。
目录
根据基础的android架构图,从下往上依次为:Linux内核、HAL层、Native Libraries、Runtime、Framework层、APP层。
每一层都包含大量的子模块或子系统,并提供固定的服务访问点SAP(service access point),具有高内聚、低耦合的特点。
一、Linux Kernel
Android操作系统以Linux内核为基石,组成底层内核空间。
1、什么是Linux内核
- 技术层面:内核是硬件和软件之间的一个中间层,将应用层的请求传递硬件,充当底层驱动程序,对系统中的各种设备和组件进行寻址
- 应用程序层面:应用程序只与内核有关,而内核就是应用程序知道的层次中的最底层
内核是资源管理程序,负责将可用的共享资源(CPU、磁盘空间等)分配给各系统进程。同时内核像一个库,提供了一组面向系统的命令。
例如:整个软件是通过系统调用(Syscall)连通系统的内核空间和用户空间。而用户空间就是接下来要说的,由HAL层、Native Libraries、Runtime、Framework层、application层组成。
内核的作用简单说,就是提供了进程管理、文件网络管理、系统安全权限管理、以及系统与硬件设备通讯基础。
2、作用
Linux内核层为Android设备的各种硬件提供底层驱动:显示驱动、音频驱动、电源管理、Flash内存驱动、进程管理、系统安全、camera驱动、蓝牙驱动、Binder IPC驱动(进程间通讯驱动)等。
二、HAL层
HAL(Hardware Abstraction Lay,硬件抽象层),是对底层驱动(即Linux内核层)进行了一层封装,向Framework层提供调用驱动的通用接口,HAL层开发者只需要按照HAL规范,实现相应接口,并以共享库的形式放在特定目录下,那上层开发者只需要加在这个共享库并找到对应模块的对应指针,即可操作底层硬件。这一层出现的目的是维护开发者利益(实现开放不开源)。
简单来说,就是将控制硬件的动作放在了HAL层。
例如:CameraHardwareInterface(camera_device_name)是Android的通用接口,通过它适配向CameraService提供硬件操作接口。
三、系统运行库层
系统运行库层是由程序库和运行时库组成。
1、Native Libraries
Android Native Libraries(程序库),是相对于Java层(即Framework层)的底层,用C/C++语言实现,提供一些本地服务和链接库。通过这一层去实现一些复杂运算,并通过JNI和Java层通讯;或是通过Native层去运行底层驱动进而操作设备。
其支持整个系统正常运行的基础库,具备9个子系统:
序号 | 子系统 | 描述 |
1 | 系统C库 | 从BSD(伯克利软件套件,Unix衍生系统)继承来的标准C系统函数库,专门为基于嵌入式Linux设备制定 |
2 | Media Manager | 媒体管理,支持多种音频、视频格式的播放和录制,以及静态图像文件,包括MP3、AAC、JPG、PNG等 |
3 | Surface Manager | 图层管理,执行多个程序时,负责管理显示与存取操作间的互动;同时负责2D与3D绘图进行显示合成 |
4 | LibWebCore | Web浏览器引擎,驱动Android浏览器和内嵌的文本视图 |
5 | SGL | 底层2D图形渲染引擎库 |
6 | QpenGL|ES | 3D绘图函数库,即OpenGL|ESate开放图形库用来支持3D效果 |
7 | FreeType | 位图和矢量字体渲染,提供点阵字与向量字的描绘与显示 |
8 | SQLite | 小型关系型数据库引擎 |
9 | SSL | 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议 |
2、运行时库
在Android 5.0+系统中,运行时库又分为核心库(Core Libraries)和ART虚拟机(Android Runtime)。
核心库主要用于提供大部分Java语言基础功能,例如:基础数据结构、I/O、工具、数据库、网络等库。Java部分最终会打包成core.jar包,当桌面启动时首先加载,作为Java程序的一个基础包。
核心库主要实现了三种Java基础包:
- Java标准API(Java包):核心包,所有程序都会使用这些包中的类,例如:java.lang(基础类)、java.util(日期时间、国际化等工具类)、java.net(网络应用开发类)等
- Java扩展API(Javax包):扩展包,对Java包的优化和扩展
- 企业和组织提供的Java类库(org包):组织具有影响力,代码质量高
ART虚拟机,是Google在Linux内核之上构建了一个虚拟机,Android应用使用java开发,运行在虚拟机之上。
Dalvik就是Android4.4及之前使用的虚拟机,它使用的是JIT(Just-In-Time)技术来进行代码转译,每次执行应用的时候,Dalvik将程序的代码编译为机器语言执行。
随着硬件水平的提升,ART虚拟机采用AOT(Ahead-Of-Time)技术,会在应用程序安装时就转换成机器语言,不再在执行时解释,从而优化了应用运行的速度。在内存管理方面,ART也有比较大的改进,对内存分配和回收都做了算法优化,降低了内存碎片化程度,回收时间也得以缩短。
详见:https://www.jianshu.com/p/1f779586efdc
四、Framework层
Framework层(Java API Framework,应用程序架构层),用Java语言编写。
基于Android核心库实现的FW层的Android包,主要负责为APP开发人员提供开发所需的API接口。除API外,还包括资源包,内含图片、多国语言字符串、布局文件等。而Android包的具体实现会通过JNI调用程序库(Native Libraries)代码。
API(Application Programming Interface,应用程序编程接口)
API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又不需要访问源码,或理解内部工作机制的细节。
API是用于构建应用程序软件的一组子程序定义、协议和工具,是一套明确定义的各种软件组件之间的通信方法。
接口:不同组件进行交互的地方
协议:一系列规定组件之间的交互规则
格式:定义交流方式(json、xml)
端点:可以在同一个接口里提供不同的特定功能
同时确认操作的合法性,反馈异常信息,并进行分页、过滤,节省带宽和服务器资源,增加访问权限,充当防火墙等。
其提供主要组件和服务为:
序号 | 组件/服务 | 描述 |
1 | Activity Manager Service | 活动管理,管理所有应用的Activity,包括创建、销毁、优先级调整,保证不同程序间合理调度 |
2 | Window Manager Service | 窗口管理,控制窗口的显示、隐藏、层序,动画处理,Display管理(多屏显示),input分发、处理 |
3 | Content Providers | 内容提供者,使应用能访问其他应用程序(如通讯录)的数据,或共享自己的数据 |
4 | View System | 视图系统,丰富的可扩展的视图集合,用来构建UI应用程序。包括列表、网格、文本框、按钮等 |
5 | Notification Manager | 通知管理,使所有应用程序能够在状态栏显示自定义提醒 |
6 | Package Manager | 包管理,负责包的管理,应用程序的安装、卸载、信息查询等 |
7 | Telephony Manager | 电话管理,提供一系列用于访问与手机通讯相关的状态和信息的方法,如SIM卡 |
8 | Resource Manager | 资源管理,提供访问非代码资源,如本地化字符串、图形和布局文件 |
9 | Location Manager | 位置管理,提供设备的GPS获取方式 |
10 | XMPP Services | XMPP服务,以XML为基础的开放式实时通信协议,可扩展通讯和标识协议 |
Android的四大组件
Activity、Service、Content Provider、Broadcast receiver
- Activity:与用户交互的入口,一个activity通常是一个窗口,每个activity都独立于其他activity而存在。对用户来说,activity就是一个Android应用的全部,这是因为其他组件对于用户来说都是不可感知的。(例如,电子邮件应用可能有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。尽管这些 Activity 通过协作在电子邮件应用中形成一种紧密结合的用户体验,但每个 Activity 都独立于其他 Activity 而存在。因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。)同时有助于实现一些系统与应用程序间的重要交互。
- Service:用于在后台完成用户指定的操作。是一个在后台运行的组件,用于执行长时间运作的操作,或为远程进程执行作业。service分为两种状态:started(启动)、bound(绑定)。例如,当用户使用其他应用时,服务可能会在后台播放音乐或通过网络获取数据,但这不会阻断用户与 Activity 的交互。
started:
① 音乐播放是用户可直接感知的服务,因此,应用会向用户发送通知,表明其希望成为前台,从而告诉系统此消息;在此情况下,系统明白它应尽全力维持该服务进程运行,因为进程消失会令用户感到不快。
② 通常,用户不会意识到常规后台服务正处于运行状态,因此系统可以更自由地管理其进程。如果系统需要使用 RAM 来处理用户更迫切关注的内容,则其可能允许终止服务(然后在稍后的某个时刻重启服务)。
bound:
如果进程 A 绑定到进程 B 中的服务,系统便知道自己需使进程 B(及其服务)为进程 A 保持运行状态。此外,如果进程 A 是用户关心的内容,系统随即也知道将进程 B 视为用户关心的内容。动态壁纸、通知侦听器、屏幕保护程序、输入方法、无障碍功能服务以及众多其他核心系统功能,均可构建为在其运行时由应用实现、系统绑定的服务。
- Content Provider:内容提供者,数据共享型组件,用于向其他组件或是APP共享数据。可以将这些数据存储在文件系统、SQLite 数据库、网络中,或者您的应用可访问的任何其他持久化存储位置。其他应用可通过content provider查询或修改数据(如果content provider允许)。
- Broadcast receiver:广播接收者,借助broadcast receiver,系统能够在常规用户流之外向应用传递事件,从而允许应用响应系统范围内的广播通知。常见用于在不同的组件或不同的应用之间进行消息传递,旨在执行极少量的工作。许多广播均由系统发起,例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可发起广播,例如,通知其他应用某些数据已下载至设备,并且可供其使用。尽管broadcast receiver不会显示界面,但其可以创建状态栏通知,在发生广播事件时提醒用户。
五、APP层
APP层(Application层,应用层),通过Java语言编写。Android自带一套用于Email、短信、日历、互联网浏览器等的核心应用,即系统应用程序,为用户提供生活中的常用应用程序,又为开发人员提供了可直接调用系统应用的关键能力,例如:APP发送短信(SMS消息),直接调用系统提供的API做相关操作。
Android 8.0编译系统简述
Android 8.0编译系统简述
概述
Android 7.0之前,android编译主要依赖makefile,随着android工程越来越大,makefile编译花费时间也越来越多,所以7.0开始逐步引入了kati soong(可选,用的话需要在执行编译时将USE_SOONG=true开启),soong会将Android.bp(用于替换Android.mk文件)文件转化为ninja文件,然后由ninja去对系统进行管理。到了8.0,android 默认启用Soong,不需要配置USE_SOONG了。
kati
kati是一个基于Makefile来生成ninja.build的小项目。 主要用于把Makefiel转成成ninja file,自身没有编译能力,转换后使用Ninja编译。
在编译过程中,kati负责把既有的Makefile、Android.mk文件,转换成Ninja文件。 在Android 7.0中,它独挑大梁。 在Android 8.0以后,它与Soong一起,成为Ninja文件的两大来源。 Kati更像是Google过渡使用的一个工具,等所有Android.mk都被替换成Android.bp之后,相信Soong工具会被打开使用来替换Kati.
在单独使用时,它对普通的小项目还能勉强生效。 面对复杂的、多嵌套的Makefile时,它往往无法支持,会出现各种各样的问题。 当然,也可以理解为,它只为Android而设计。
总之,不推荐在Android以外的任何项目中使用kati。
Soong
soong是由Go语言写的一个项目,从Android 7.0开始,在prebuilts/go/目录下新增了Go语言所需的运行环境,Soong在编译时使用,解析Android.bp,将之转化为Ninja文件,完成Android的选择编译,解析配置工作等。故Soong相当于Makefile编译系统的核心,即build/make/core下面的内容。
另外Soong还会编译产生一个androidmk命令,可以用来手动将Android.mk转换成Android.bp文件。不过这只对无选择、循环等复杂流程控制的Android.mk生效。
Android.bp
Android.bp是用来替换Android.mk的,用类似JSON的声明来描述需要构建的模块,使用Blueprint框架来解析,最终转换成ninja,与Android.mk相比设计非常简洁,没有分支、循环等流程控制,android的选择编译、解析配置等需求,就交给了Soong去完成。
Blueprint
Blueprint也是由Go语言写的,是Soong的一部分,负责解析Android.bp,主要是解析文件的形式,内容还是交由soong去解释。
在Android编译最开始的准备阶段,会执行build/soong/soong.bash进行环境准备。 其中会先编译、安装Blueprint到out目录下。 也就是说,在编译Android项目时,Android.bp相关工具链会自动编译,无需费神。
Soong是与Android强关联的一个项目,而Blueprint则相对比较独立,可以单独编译、使用。
Ninja
Ninja是一个致力于速度的小型编译系统(类似于Make),如果把其他编译系统比做高级语言的话,Ninja就是汇编语言。通常使用Kati或soong把makefile转换成Ninja files,然后用Ninja编译。
主要有两个特点:
- 可以通过其他高级的编译系统生成其输入文件;
- 它的设计就是为了更快的编译;
ninja核心是由C/C++编写的,同时有一部分辅助功能由python和shell实现。由于其开源性,所以可以利用ninja的开源代码进行各种个性化的编译定制。
各工具之间的关系
Android.mk文件、Android.bp、kati、Soong、Blueprint、Ninja之间的关系如下:
Android.bp --> Blueprint --> Soong --> Ninja
Makefile or Android.mk --> kati --> Ninja
(Android.mk --> Soong --> Blueprint --> Android.bp)
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。 Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义。
Android.mk可以通过Soong提供的androidmk转换成Android.bp,但仅限简单配置。 目前Oreo的编译流程中,仍然是使用kati来做的转换。
现存的Android.mk文件、既有的Android.bp,都会分别被转换成Ninja。 从Android.mk与其它Makefile,会生成out/build-<product_name>.ninja文件。 而从Android.bp,则会生成out/soong/build.ninja。 此外,还会生成一个较小的out/combined-<product_name>.ninja文件,负责把二者组合起来,作为执行入口。
最终,Ninja文件才是真正直接控制源码编译的工具。
以上是关于简述Android操作系统的主要内容,如果未能解决你的问题,请参考以下文章