目录
一、Linux Kernel
1、什么是Linux内核
2、作用
二、HAL层
三、系统运行库层
1、Native Libraries
2、运行时库
四、Framework层
Android的四大组件
五、APP层
根据基础的Android架构图,从下往上依次为:Linux内核、HAL层、Native Libraries、Runtime、Framework层、APP层。
每一层都包含大量的子模块或子系统,并提供固定的服务访问点SAP(service access point),具有高内聚、低耦合的特点。
Android操作系统以Linux内核为基石,组成底层内核空间。
内核是资源管理程序,负责将可用的共享资源(CPU、磁盘空间等)分配给各系统进程。同时内核像一个库,提供了一组面向系统的命令。
例如:整个软件是通过系统调用(Syscall)连通系统的内核空间和用户空间。而用户空间就是接下来要说的,由HAL层、Native Libraries、Runtime、Framework层、application层组成。
内核的作用简单说,就是提供了进程管理、文件网络管理、系统安全权限管理、以及系统与硬件设备通讯基础。
Linux内核层为Android设备的各种硬件提供底层驱动:显示驱动、音频驱动、电源管理、Flash内存驱动、进程管理、系统安全、camera驱动、蓝牙驱动、Binder IPC驱动(进程间通讯驱动)等。
HAL(Hardware Abstraction Lay,硬件抽象层),是对底层驱动(即Linux内核层)进行了一层封装,向Framework层提供调用驱动的通用接口,HAL层开发者只需要按照HAL规范,实现相应接口,并以共享库的形式放在特定目录下,那上层开发者只需要加在这个共享库并找到对应模块的对应指针,即可操作底层硬件。这一层出现的目的是维护开发者利益(实现开放不开源)。
简单来说,就是将控制硬件的动作放在了HAL层。
例如:CameraHardwareInterface(camera_device_name)是Android的通用接口,通过它适配向CameraService提供硬件操作接口。
系统运行库层是由程序库和运行时库组成。
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 | 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议 |
在Android 5.0+系统中,运行时库又分为核心库(Core Libraries)和ART虚拟机(Android Runtime)。
核心库主要用于提供大部分Java语言基础功能,例如:基础数据结构、I/O、工具、数据库、网络等库。Java部分最终会打包成core.jar包,当桌面启动时首先加载,作为Java程序的一个基础包。
核心库主要实现了三种Java基础包:
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层(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不会显示界面,但其可以创建状态栏通知,在发生广播事件时提醒用户。
详见:https://blog.csdn.net/superzhang6666/article/details/126308499?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-126308499-blog-50524704.pc_relevant_3mothn_strategy_and_data_recovery&spm=1001.2101.3001.4242.2&utm_relevant_index=4
APP层(Application层,应用层),通过Java语言编写。Android自带一套用于Email、短信、日历、互联网浏览器等的核心应用,即系统应用程序,为用户提供生活中的常用应用程序,又为开发人员提供了可直接调用系统应用的关键能力,例如:APP发送短信(SMS消息),直接调用系统提供的API做相关操作。