Android系統底層啟動源碼分析(開機啟動)

Android系統底層啟動源碼分析(開機啟動)

總體啟動過程 Android上電啟動後主要執行腳本和啟動的服務 Android啟動細節 Android啟動整體流程圖

一、總體啟動過程

? 啟動入口:init進程,是Linux系統中用戶空間的第一個進程
? 加載配置(init.rc)
? 啟動孵化器(zygote)
? system_init啟動Native層
? ServiceThread啟動Java

二、Android上電啟動後主要執行腳本和啟動的服務

Init是第一個被加載的用戶進程,其會先執行init.rc腳本,源碼位置:/system/core/init/init.c

進程入口:Main方法,啟動init.rc系統啟動的配置文件

這裡寫圖片描述

init.rc配置文件信息:

文件位置:/system/core/rootdir 守護進程啟動(Daemon Process):/system/bin/servicemanager Zygote——app_main.cpp

在腳本裡面各種create、mount、啟動service等,例如啟動重要的Zygote孵化器:

這裡寫圖片描述

之後進入App_main,cpp中啟動孵化器:
這裡寫圖片描述

進入Runtime.Start:
這裡寫圖片描述

註:
Init1 和init2 兩個主要函數 ,其中init1主要是kernel啟動後的對libraries層的intiàsystem_init(), 如其中的一些suiface manager、libc等,然後調用init2
Init2主要是對 Framwork層的init


三、 Android啟動細節:

Early init -> init –> early boot -> boot
由Init啟動Zygote之後:
當解析完init.rc和設備配置信息後會獲取到一系列Action, Init將動作的執行劃分為四個階段:

early-init Init early-boot boot

Zygote簡介:

本身為Native的應用程序 由init進程通過init.rc加載

啟動過程:

Main方法中AppRuntime.start(),工作由父類AndroidRuntime來完成 在AndroidRuntime中啟動“com.android.internal.os.ZygoteInit”的main方法 進入java世界的入口

細節內容:
在AndroidRuntime中同時啟動的有:

startVM——開啟虛擬機(查看堆內存設置) 註冊JNI函數 各類參數的傳遞

Zygote孵化器的守護進程(Daemon Process)

這裡寫圖片描述

同時會開啟Adb的守護進程,在此之後才可以用adb與Android設備連接,這也是為什麼有時候Android系統界面還沒起來,卻可以用adb的原因:

這裡寫圖片描述

Init.rc中的啟動級別,通過on early init …on boot等區分
創建Java虛擬機JVM:
這裡寫圖片描述

啟動虛擬機並且註冊JNI Native函數(JNI所用),為瞭後面加載libraries中的C/C++代碼
這裡寫圖片描述


ServerThead的啟動:
啟動步驟:

ZygoteInit在main方法中利用JNI開啟com.android.server.SystemServer 啟動system_init.cpp處理Native層的服務 然後調用SystemServer的init2() 啟動ServiceThread,啟動android服務 Launcher啟動

細節內容

preloadClasses()—通過反射加載各個類 Launcher的啟動—通過過濾器中HOME配置加載

預加載class(Zygote中的main函數中執行,這個過程大約加載瞭2000多個類,消耗15s以上)
這裡寫圖片描述

到init2中PackageManager會掃描所有apk的清單文件,將帶有Home的啟動(所有開機啟動的apk都會在這一步啟動)

這裡寫圖片描述


四、Android啟動整體流程圖

這裡寫圖片描述

You May Also Like