掌握 Android 系统架构,看这一篇就够了!

Android系统庞大且错综复杂,本文作者Gityuan将带领大家初探Android系统整体架构,一窥其全貌 。

掌握 Android 系统架构,看这一篇就够了!

文章插图
 
作者 | 袁辉辉
本文经授权转载自Android达摩院(ID:gityuanblog)
引言
本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制 。虽然Android系统非常庞大且错综复杂,需要具备全面的技术栈,但整体架构设计清晰 。Android底层内核空间以linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间 。对于用户空间主要采用C++和JAVA代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统 。
为了能让大家整体上大致了解Android系统涉及的知识层面,先来看一张google官方提供的经典分层架构图,从下往上依次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构,其中每一层都包含大量的子模块或子系统 。
掌握 Android 系统架构,看这一篇就够了!

文章插图
 
上图采用静态分层方式的架构划分,众所周知,程序代码是死的,系统运转是活的,各模块代码运行在不同的进程(线程)中,相互之间进行着各种错终复杂的信息传递与交互流,从这个角度来说此图并没能体现Android整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的 。为了更深入地掌握Android整个架构思想以及各个模块在Android系统所处的地位与价值,计划以Android系统启动过程为主线,以进程的视角来诠释Android M系统全貌,全方位的深度剖析各个模块功能,争取各个击破 。这样才能犹如庖丁解牛,解决、分析问题则能游刃有余 。
Android架构
Google提供的5层架构图很经典,但为了更进一步透视Android系统架构,本文更多的是以进程的视角,以分层的架构来诠释Android系统的全貌,阐述Android内部的环环相扣的内在联系 。
系统启动架构图
掌握 Android 系统架构,看这一篇就够了!

文章插图
 
图解:Android系统启动过程由上图从下往上的一个过程是由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App,接来下简要说说每个过程:
关于Loader层:
  • Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在 ROM里的预设代码开始执行,然后加载引导程序到 RAM;
  • Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能 。
2.1 Linux内核层
Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能 。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序 。
  • 启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;
  • 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程 。kthreadd进程是所有内核进程的鼻祖 。
2.2 硬件抽象层 (HAL)
硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块 。
2.3 Android Runtime & 系统库
每个应用都在其自己的进程中运行,都有自己的虚拟机实例 。ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少 。ART主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持 。
这里的Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等 。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖 。