前言
看了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
。