整理一下,android的啟動流程,主要的資料都是從網上搜的,只是做個整理方便以后瀏覽。
Android架構介紹
Android的架構可以從架構圖得知,主要分四層:
看這兩張圖對android架構有一個整體的概念
Android啟動概述
概述:Loader > Kernel > Native > Framework > Application
細分:BootRom > Bootloader > Kernel > Init > Zygote > SystemServer > Launcher
Loader層主要包括Boot Rom和Boot Loader
Kernel層主要是Android內核層
Native層主要是包括init進程以及其fork出來的用戶空間的守護進程、HAL層、開機動畫等
Framework層主要是AMS和PMS等Service的初始化
Application層主要指SystemUI、Launcher的啟動
Loader > Kernel > Native簡單描述
BootLoader介紹
引導加載程序是系統加電后運行的第一段軟件代碼,稱之為Bootloader,簡單地說,BootLoader就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。
Kernel初始化介紹
Kernel初始化由start_kernel函數(\init\main.c)開始,至第一個用戶進程init結束,可以分成三部分:zImage解壓縮、kernel的匯編啟動階段、Kernel的C啟動階段
Init初始化介紹
init進程是Linux內核啟動后創建的第一個用戶空間的進程,init在初始化過程中會啟動很多重要的守護進程。
init進程初始化系統后,會化身為守護進程來處理子進程的死亡信號、修改屬性的請求和組合鍵事件
Zygote啟動介紹
在init.rc中,import zygote的啟動rc文件:import /init.${ro.zygote}.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin \
--zygote --start-system-server --socket-name=zygote
class main
priority -20
user root
group root readproc
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin \
--zygote --socket-name=zygote_secondary --enable-lazy-preload
class main
priority -20
user root
group root readproc
socket zygote_secondary stream 660 root system
onrestart restart zygote
writepid /dev/cpuset/foreground/tasks
app_process啟動代碼位于alps/frameworks/base/cmds/app_process/app_main.cpp,主要操作如下:
初始化AppRuntime,AppRuntime繼承于AndroidRuntime
解析傳入參數
根據參數啟動Zygote
在解析完參數后,最終調用:com.android.internal.os.ZygoteInit進行Zygote的初始化
AppRuntime初始化調用的是AndroidRuntime的構造函數,AndroidRuntime初始化時會初始化Skia圖形系統
AppRuntime啟動zygote時調用的是AndroidRuntime的start函數
start函數主要做了以下操作:
1.判斷是否啟動systemserver
2.啟動虛擬機
3.注冊JNI函數
4.調用JNI函數
在ZygoteInit的main函數中,調用了nativeZygoteInit方法,即調用了JNI函數com_android_internal_os_ZygoteInit_nativeZygoteInit(),該方法會調用AndroidRuntime->onZygoteInit(),onZygoteInit在AppRuntime中被重載,創建一個ProcessState并調用startThreadPool,startThreadPool啟動線程池處理Binder的通信請求
ZogyteInit的main函數主要操作:
1.創建ZogyteServer并標記啟動
2.設置進程pid和gid為0
3.解析參數
4.創建本地socket服務
5.預加載系統類和資源
6.fork SystemServer進程
7.啟動ZogyteServer的selectLoop線程處理子進程的命令
SystemServer啟動介紹
SystemServer需要從Zygote fork SystemServer開始分析,主要是設置參數,然后調用Zygote的forkSystemServer方法,再判斷是否有SecondaryZygote啟動,有則等待其啟動,無則返回
Zygote的forkSystemServer方法主要是調用了native方法nativeForkSystemServer,在native層進行fork動作,并設置pid、gid、selinux安全上下文等,最后啟動com.android.server.SystemServer
SystemServer是一個Java類,從main函數入口分析,主要調用run方法,主要工作是:
1.調整時間,如果系統時間比1970還要早,調整到1970年
2.設置語言
3.調整虛擬機堆內存大小和內存利用率
4.初始化Looper為mainLooper
5.裝載庫libandroid_server.so
6.初始化系統Context
7.創建SystemServiceManager負責系統Service啟動
8.創建和啟動Java服務
9.調用Looper.loop(),進入處理消息的循環
Launcher啟動
SystemUI在AMS執行systemReady時啟動,主要是通過Intent啟動包名為com.android.systemui組件名為SystemUIService的服務,然后通過調用WindowManager的onSystemUiStarted方法調用KeyguardService啟動鎖屏服務。SystemUI啟動成功后表示系統的通知欄和導航欄已經初始化成功,接下來就是啟動Launcher
Launcher的啟動在AMS的最后,通過startHomeActivityLocked把啟動Launcher的Activity并將其置于Activity棧頂,然后通過resumeFocusedStackTopActivityLocked將棧頂的Activity顯示到界面上,launcher的啟動就已經完成了