轉自Gityuan的Android開篇,對自我學習作進一步整理。
Android系統以
Linux內核
作為基底,上層采用Native層
和Java層
。系統分為內核空間和用戶空間,并通過系統調用(Syscall
)連通。用戶空間主要采用C++和Java代碼實現,通過JNI
技術連通Java層和Native層(C/C++)。
圖片來源 [GITYUAN](http://gityuan.com/android/)
Loader層
- <b>Boot ROM</b>: 電源按下,引導芯片代碼開始從預定義的地方(固化在ROM)開始執行.加載引導程序到
RAM
,然后執行. - <b>Boot Loader</b>: 這是
Android
系統系統之前的引導程序,主要用來檢測外部的RAM
以及設置網絡、內存、初始化硬件參數等.
Kernel層
Kernel層是指Android
內核層,到這里才剛剛開始進入Android
系統。
- 啟動
Kernel
的<b>swapper進程</b>(pid=0):該進程又稱為idle
進程, 系統初始化過程Kernel
由無到有開創的第一個進程, 用于初始化進程管理、內存管理,加載Display,Camera Driver,Binder Driver
等相關工作(圖中kernel
層藍色區塊); - 啟動<b>kthreadd進程</b>(pid=2):是
Linux
系統的內核進程,會創建內核工作線程kworkder
,軟中斷線程ksoftirqd,thermal
等一系列內核守護進程。kthreadd進程是所有內核進程的父進程。
Linux
內核加載主要包括初始化kernel
核心(內存初始化,打開中斷,初始化進程表等)、初始化驅動、啟動內核后臺(daemons
)線程、安裝根(root
)文件系統等。后續啟動第一個用戶級進程init
(pid=1).
Native層
Native層
主要包括啟動init進程
(Android
的第一個用戶空間進程)、HAL層
(硬件抽象層)以及開機動畫
等。init進程是所有用戶進程的鼻祖
。同時init進程
也會孵化一系列用戶進程,還會啟動關鍵的服務以及孵化Zygote進程
。
-
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層
如圖,Framework層
分為Java Frameword
和C++ Framework
,分別由system_server進程
和media_server進程
負責啟動和管理。
Zygote
本身是一個Native
的應用程序,剛開始的名字為“app_process”
,運行過程中,通過系統調用將自己名字改為Zygote
。在圖中的紅色線,便是Zygote fork
出來的進程,所有的App進程
都是由Zygote fork
產生的。
image.png
-
Zygote進程
,是由init進程通過解析init.rc文件后fork生成的,Zygote進程主要包含:
加載ZygoteInit類,注冊Zygote Socket服務端套接字;
加載虛擬機;
preloadClasses;
preloadResouces。 -
System Server進程
,是由Zygote進程fork而來,System Server是Zygote孵化的第一個進程,System Server負責啟動和管理整個Java framework,包含ActivityManager,PowerManager等服務。 -
Media Server進程
,是由init進程fork而來,負責啟動和管理整個C++ framework,包含AudioFlinger,Camera Service,等服務。
App層
-
Zygote進程孵化出的第一個App進程是Launcher
,這是用戶看到的桌面App; - Zygote進程還會創建Browser,Phone,Email等App進程,每個App至少運行在一個進程上。
- 所有的App進程都是由Zygote進程fork生成的。
Syscall && JNI
- Native與Kernel之間有一層系統調用(SysCall)層,見Linux系統調用(Syscall)原理;
- Java層與Native(C/C++)層之間的紐帶JNI,見Android JNI原理分析。