1.Android系统架构
Android系统从上到下一共分为5层,分别为应用层(Application),系统框架层(framework),系统运行库层(Native),硬件抽象层(HAL),内核层(kernel)
1.1 应用层(Application)
系统内置的应用程序以及第三方的应用程序都是属于应用层,和用户直接交互,提供给用户使用,大部分由Java实现
1.2 应用框架层(framework)
负责提供给应用层的开发人员相应的统一的API,也包括系统应用。这一层的是由Java代码编写的,可以称为Java Framework。下面来看这一层所提供的主要的组件。例如四大组件,AMS、WMS、PMS等,均位于该层。
1.3 系统运行库层(Native)
这一层分为两部分,一部分为C++程序库,一部分为Android运行库
Android运行库:运行时库又分为核心库和ART(5.0系统之后,Dalvik虚拟机被ART取代)。核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。C/C++程序库能被Android系统中的不同组件所使用,并通过应用程序框架为开发者提供服务,通过JNI来调用C/C++程序库中的代码
以下是一些核心库:
◆系统 C 库 – 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。
◆媒体库 – 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
◆Surface Manager – 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
◆SQLite – 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
1.4 硬件抽象层(HAL)
硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
1.5 Linux内核层(kernel)
Android 平台的基础是 Linux 内核。Android核心系统服务依赖于Linux内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型 ,驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。并且允许设备制造商为其内核开发硬件驱动程序。
1.6Android 架构的简易流程:
例如:应用层中的System UI ——> Framework层中的Service(提供给上层的接口服务)——>Native层中的JNI ——> HAL层(设备抽象文件,提供操作设备的接口)——>Linux kernel driver(通过设备驱动进行调整)
2.Android系统各层的职责
应用层:关注业务逻辑,注重用户体验。
应用框架层:承上启下,即要为应用层提供统一的API,并且要确保上层调用的功能是可以实现的(不需要上层去考虑获取权限状态等非业务逻辑的事情),又要使用JNI来调用下层的Native方法来完成功能
系统运行库层:也是承上启下,即要给framework层提供接口(JNI)来调用这一层的Native方法(C++),也要调用HAL层的代码,让整个的上层的业务逻辑代码转变为底层的实现代码
硬件抽象层:连接底层驱动,负责底层业务,到达驱动之后的代码基本上就只负责设备控制了
Linux内核层:通过操作系统内核管理,注册设备和节点 调用对应驱动修改寄存器
3.Android系统源码目录
常用目录:
/frameworks 应用框架层的核心代码
- frameworks/av 如音视频解码器,录屏工具, 摄像头框架相关代码, 多媒体框架供上层程序调用的java API
- frameworks/base 基础核心代码
- frameworks/hardware 传感器
- frameworks/native c/c++本地语言编写的相关工具源码和特定硬件控制的头文件
- frameworks/opt 一些UI插件和java后台服务
/frameworks/base重要目录结构如下
cmds: 开机启动的进程代码和命令(脚本), 著名的zygote进程代码和启动动画代码就在此处。
java: Android应用开发锁依赖的各种包, 四大组件代码就在此
jni: 服务于android系统java核心代码所需要的jni,被编译成libandroid_runtime.so
res: 系统中所需要的各种资源, 图片,字符串,尺寸,布局文件等
data:系统默认的铃声,字体, 根文件系统etc目录部分配置文件,触摸需要的kl, kcm文件等。
libs:大部分都是c/c++代码,编译成so, 如Canvas 的drawing 操作转换为OpenGL 的操作的libhwui.so
native : 部分硬件相关的jni库:如sensor, net, 存储管理, 最后合并在libandroid.so中
packages:著名的SystemUI,彩蛋,锁屏,SettingProvider(系统设置数据提供者)
services :android开机启动的大部分后台服务,如PMS, AMS, WMS等
/hardware 主要是硬件抽象层
/kernel Android系统内核
/libcore 核心库的相关文件
/system 底层系统库,组件等
/vendor 厂商定制部分
目录结构与Android系统架构层级的大致对应关系:
3.Android系统启动流程
步骤:Bootloader → kernal → init进程 → Zygnote → SystemServer → ServiceManager → Home Launcher
(1)当手机摁下开机键后,会引导芯片启动,并引导固化在芯片中的程序(Boot Loader) 加载到内存中运行 ROM→RAM
(2)引导程序(Boot Loader)运行后,会检查RAM,并且初始化硬件参数,并找到Linux内核代码加载到内存中
(3)Linux内核运行,进入到Kernel层,Kernel会先启动swapper进程(pid=0),用于初始化进程,内存管理,加载设备驱动等一些操作系统内核功能,然后swapper(pid=0)进程会启动kthreadd进程(pid=2)内核中的其他线程PPID都是2,说明这些线程都是由kthreadd进程创建的,因此可以说kthreadd进程负责内核线程的创建、维护等工作,是其他线程的基础,kthreadd就是专门负责内核线程管理工作的。
(4)Kernel层加载完毕后,硬件设备驱动与HAL层进行交互。初始化进程管理等操作,然后swapper(pid=0)进程会启动init进程,读取init.rc中的相关配置,这些在Native层中实现(C++实现,属于系统服务)。
-
需要挂载目录 例如: /sys, /dev,/proc
-
运行 init.rc脚本,并启动属性服务,以及一系列的服务和进程。
- init进程在<安卓源代码目录>/system/core/init
- init.rc文件在 <安卓源代码目录>/system/core/rootdir/
(5)Init进程(pid=1,init 进程是所有用户空间进程中第一个被创建的)启动后,会启动 adbd / logd 等用户守护 Daemons 进程,并且会启动Service Manager (Binder服务管家) 等重要服务,同时启动 Zygote 进程,这里属于C++ Framework,代码为C++程序;
(6)Zygote进程是由 Init 进程解析 init.rc 文件后 fork 生成,它会加载虚拟机,开始创建新进程启动系统服务 (SystemServer进程) ;System Server负责启动和管理整个Java Framework,包含 ActivityManager,WindowManager,PackageManager,PowerManager等framework层提供的服务组件;该进程启动后,可以看到开机动画
(7)Zygote同时会启动相关的APP进程,它启动的第一个APP进程为Launcher,然后启动Email,SMS等进程,所有的APP进程都有Zygote fork生成。
(8)完成开机引导。 “ACTION_BOOT_COMPLETED”开机启动广播就会发出去