转自Gityuan的Android开篇,对自我学习做进一步整理。html
Android系统以
Linux内核
做为基底,上层采用Native层
和Java层
。系统分为内核空间和用户空间,并经过系统调用(Syscall
)连通。用户空间主要采用C++和Java代码实现,经过JNI
技术连通Java层和Native层(C/C++)。android
RAM
,而后执行.Android
系统系统以前的引导程序,主要用来检测外部的RAM
以及设置网络、内存、初始化硬件参数等.Kernel层是指Android
内核层,到这里才刚刚开始进入Android
系统。git
Kernel
的swapper进程(pid=0):该进程又称为idle
进程, 系统初始化过程Kernel
由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver
等相关工做(图中kernel
层蓝色区块);Linux
系统的内核进程,会建立内核工做线程kworkder
,软中断线程ksoftirqd,thermal
等一系列内核守护进程。kthreadd进程是全部内核进程的父进程。
Linux
内核加载主要包括初始化kernel
核心(内存初始化,打开中断,初始化进程表等)、初始化驱动、启动内核后台(daemons
)线程、安装根(root
)文件系统等。后续启动第一个用户级进程init
(pid=1).网络
Native层
主要包括启动init进程
(Android
的第一个用户空间进程)、HAL层
(硬件抽象层)以及开机动画
等。init进程是全部用户进程的鼻祖
。同时init进程
也会孵化一系列用户进程,还会启动关键的服务以及孵化Zygote进程
。app
init进程
会孵化出ueventd、logd、healthd、installd、adbd、lmkd
等用户守护进程;init进程
还启动servicemanager(binder服务管家)、bootanim(开机动画)
等重要服务init进程
孵化出Zygote进程
,Zygote进程
是Android系统的第一个Java进程
,Zygote是全部Java进程的父进程
,Zygote进程
自己是由init进程
孵化而来的。
- kthreadd进程: 是全部内核进程的父进程
- init进程 : 是全部用户进程的父进程(或者父父进程)
- zygote进程 : 是全部上层Java进程的父进程,另外zygote的父进程是init进程。
如图,Framework层
分为Java Frameword
和C++ Framework
,分别由system_server进程
和media_server进程
负责启动和管理。学习
Zygote
自己是一个Native
的应用程序,刚开始的名字为“app_process”
,运行过程当中,经过系统调用将本身名字改成Zygote
。在图中的红色线,即是Zygote fork
出来的进程,全部的App进程
都是由Zygote fork
产生的。
动画
Zygote进程
,是由init进程经过解析init.rc文件后fork生成的,Zygote进程主要包含:System Server进程
,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,PowerManager等服务。Media Server进程
,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service,等服务。Zygote进程孵化出的第一个App进程是Launcher
,这是用户看到的桌面App;