Android发展历史
Android 是一个流行的移动操作系统,由 Google 开发并于 2008 年首次推出。
Android是基于Linux开发的移动设备操作系统。
在2005年被Google收购,2008年发布Android1.0,后续发布1.5/1.6 ------ 直到2021年发布Andriod12 。
Android分层设计
主要可以分为上述的六层:
内核层
Android以Linux系统为基础,借助Linux内核服务实现硬件设备驱动,进程管理,内存管理,网络协议栈,电源管理,无线通信,设备驱动,文件系统,Binder(IPC)驱动等核心功能。
HAL硬件管理层
因为很多硬件产商不希望公开其设备驱动的源代码,因此需要将应用框架层和内核的设备驱动隔离,让应用程序框架的开发不完全依赖于具体的驱动设备,减少对linux内核的依赖,因此设计了HAL硬件管理层,制定了一套应用层对硬件层读写和配置的统一接口,将硬件的驱动分为用户空间和内核空间。
Android运行时库层
包含JAVA核心库和ART 虚拟机。
原生C++库层
系统类库大部分是由C/C++编写的,提供的功能通过Android应用程序框架为开发者使用,例如:资源文件管理,基础算法库,第三方类库。
JAVA API框架层
应用框架层提供了一些类的类库框架,方便开发人员调用,通过组件重用能够快速开发出应用程序,主要包含以下组件:
管理器/组件 | 功能 |
---|---|
Content Provider(内容提供者) | 提供一个应用程序访问另一个应用程序数据的功能 |
View System(视图系统) | 提供各种视图控件 |
Activity Manager(活动管理器) | 管理各种应用程序生命周期 |
Location Manager(位置管理器) | 提供位置服务 |
Package Manager(包管理器) | 管理应用程序的安装卸载 |
Notification Manager(通知管理器) | 管理通知 |
APP层
提供一些核心应用程序包,例如电子邮件,短信,日历,地图,浏览器等。开发者可以利用JAVA语言设计和编写属于自己的应用程序。
Android启动流程
安卓启动流程主要涉及从开机到系统完全启动并准备好接收用户请求的一系列步骤。这个过程可以分为几个主要阶段,包括引导芯片代码的执行、Bootloader的启动、内核的初始化、以及Android系统的启动。
引导芯片代码的执行:当按下手机电源键时,引导芯片代码从预定义的地方开始执行,加载引导程序Bootloader到RAM。
Bootloader的启动:Bootloader在Android系统初始化前运行,主要负责设置网络、内存等,为内核运行做准备。
内核的初始化:内核启动与Linux相似,包括设置高速缓存、受保护的内存、调度和加载驱动程序。当内核完成系统设置后,它会在系统文件中寻找需要初始化的服务。
Android系统的启动:
启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
启动zygote进程,这是为了启动systemServer进程。
启动ActivityManagerService(AMS),负责管理系统中所有的Activity,包括启动、暂停、停止等操作。
创建新的Task和ActivityRecord,用于跟踪和管理Activity的状态。
调度Activity启动,将启动请求添加到消息队列中等待调度。
启动应用进程,如果目标Activity所属的应用进程未运行,则通过Zygote进程创建一个新的应用进程。
创建Activity实例,包括创建Application对象和目标Activity的实例。
创建和显示Activity界面,使Activity变为可见状态。
这个过程由上而下,从底层硬件到上层应用,确保Android系统能够正常工作并响应用户的请求。
Binder通信机制
Binder机制是一种进程间通信机制,从Android应用层角度来说,Binder是客户端和服务端进行通信的媒介。
binder通信模型
客户端和服务端要进行binder通信,需要分为以下三个步骤:
1、注册服务
Server在自己的进程向binder驱动申请创建service的binder实体
binder驱动为这个service创建位于内核的binder实体节点和binder引用
server通过binder驱动将该service的名字和对应的binder引用打包发给serviceManager
ServiceManager收到数据包后,取出service的名字和引用,填入一张查找表
2、获取服务
Client利用handle值为0的引用找到serviceManager
向ServiceManager发送XXXService的访问申请
ServiceManager从请求包中获取XXXService的名字,在查找表中找到对应的binder引用
ServiceManager将XXXService的binder引用回复给Client
3、使用服务
发送方通过自己的binder实体进行发送操作,把数据通过接收方的binder引用给接收方
binder驱动会处理这个发送请求,利用内核空间的MMAP(内存映射)机制进行通信。