轉自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;