一、Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)联通系统的内核空间与用户空间,对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层,从而连通整个系统。
上图是Android系统的架构组成,下图是Android系统启动的过程
安卓系统启动过程:BootLoader引导开机,然后依次进入->Kernel->Native->Framework->App
1、Loader层
Boot ROM:当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM
Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能
2、Linux内核层
(1)Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能
(2)Linux内核安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序
(3)启动Kernel的swapper进行(pid = 0):该进程又称为idle进程,系统初始化Kernel由无到有开创的第一个进程,用于初始化进行管理、内存管理,加载Display,Camera Driver、Binder Driver等相关工作
(4)启动kThreadd进程(pid = 2):是Linux的内核进程,会创建内核工作线程kworker,软终端线程ksoftirqd,thermal等内核守护进程,kThreadd是所有内核进程的鼻祖。
3、硬件抽象层(HAL)
提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块
4、Android Runtime & 系统库
(1)每个应用都在其自己的进程中运行,都有自己的虚拟机实例
(2)ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少
(3)ART主要包括预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC)以及调试相关的支持
(4)这里Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等,启动init进程(pid = 1)是Linux系统的用户进程,init进程是所有用户进程的鼻祖
init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程
init进程还启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务
init进程孵化出Zygote进程,Zygote进程是Android系统的一个Java进程(虚拟机进程),Zygote进程是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来
5、Framework层
(1)Zygote进程是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:
a.加载ZygoteInit类,注册Zygote Socket服务端套接字
b.加载虚拟机
c.提前加载类preloadClasses
d.提前加载资源preloadResouces
(2)System Servier进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务
(3)Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务
6、APP层
(1)Zygote进程服务出的第一个App进程是Launcher,这是用户看到的桌面App
(2)Zygote进程还会创建Browser,Phone,Email等APP进程,每个App至少运行在一个进程上
(3)所有的App进程都是Zygote进程fork生成的
7、Syscall && JNI
(1)Native与Kernel之间有一层系统调用层(Syscall)
(2)Java层与Native(C/C++)层之间的纽带JNI