前言
看了Gityuan
大神的博客,最近因为遇到一些工作上的问题踩了坑,决定正式开始阅读Android framework
层源码,当然后面可能还会经历一个多月的毕设流程,等毕业回来工作也正式要迈上正轨了,好几个月没写博客了,前段时间因为感情上的问题消沉了几个月,好在现在走出来了,其实很早以前就想阅读framework
了,趁着这段时间就开始吧。今天这篇文章主要梳理下Android
整体的架构和系统启动的流程。文章参考Android系统开篇。主要目的是加深自己的记忆。
Android 系统架构
google
经典的四层架构从下往上分别为:Linux
内核层、系统库和Android
运行时环境、framework
层和应用层这四层架构。按照Gityuan
大神的视角,我们也从系统启动过程为主线,以进程的视角来剖析Android
系统的架构
Android 启动架构
这里先上一张Android 系统启动的架构图:
可以看到:Android
系统启动是从下往上的一个过程:Loader
->Kernel
->Native
->Framework
->App
。
Loader 层
Boot Rom
:当手机处于关机状态时,长按开机键开机,会引导芯片开始从固化在Rom
里预设的代码开始执行,然后加载引导程序到Ram
.Boot Loader
:这是启动Android
系统之前的引导程序,主要是检查Ram
、初始化参数等功能。
Kernel 层
kernel
层指的就是Android
内核层,到这里才刚刚进入Android
系统
- 启动
Kernel
层的swapper
进程(pid=1),系统初始化过程Kernel创建的第一个进程,用于初始化进程管理、内存管理,加载Display
、Camera
、Binder
等驱动相关工作。 - 启动
kthreadd
(pid=2),这是Linux
系统的内核进程,会创建内核工作线程kworkder
、软中断线程ksoftirqd
和thermal
等内核守护进程。kthreadd
是所有内核进程的鼻祖。
Native 层
这里的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
进程的父进程。
Framework 层
framework
主要包括Zygote进程
、SystemServer进程和
MediaServer进程`。
Zygote 进程
Zygote
进程是由init
进程通过解析init.rc
文件后fork
生成的。Zygote
的任务主要包括:
- 加载
ZygoteInit
类,注册Zygote Socket
服务端套接字。 - 加载虚拟机
preloadClassses
preloadResources
System Server 进程
System Server
进程是由Zygote
进程fork
而来,System Server
是Zygote
孵化的第一个进程。System Server
负责启动和管理整个Java Framework
,包含ActivityManager
、PowerManager
等服务。
Media Server 进程
Media Server
进程由init
进程fork
而来,负责管理整个C++ Framework
,包含AudioFlinger
、Camera Service
等服务。
App 层
Zygote
进程孵化出的第一个App
进程是Launcher
,也就是用户看到的桌面App
。同时Zygote
进程还会创建Browser
、Phone
、Email
等App
进程。也就是说所有的App
进程都是由Zygote
进程fork生成的。
Syscall 和 JNI
Native
层和Kernel
层有一个系统调用层,也就是Syscall
。Java
层和native
层之间的纽带是JNI
。