一文帶你了解Android系統(tǒng)的啟動流程

系統(tǒng)啟動流程
首先是這個Loader層,當手機處于關機狀態(tài)時,我們長按電源鍵它就會開機。主板通電之后,會引導芯片開始執(zhí)行燒錄在存儲器里的預設代碼,然后加載引導程序到我們的內(nèi)存中。這里主要是做一些內(nèi)存檢查和硬件參數(shù)的初始化等功能。
開機引導程序執(zhí)行完成之后,就會開始加載Linux Kernel的核心代碼。在這一層里面,主要是去加載一些硬件的驅(qū)動,比如我們常用的相機驅(qū)動、顯示屏驅(qū)動、輸入驅(qū)動,還有一些media服務等驅(qū)動。硬件的驅(qū)動是在Kernel這一層所加載的。但是如果說我們的上層應用想要訪問這個硬件設備的話,都必須要通過這個Hardware Abstract Layer,也就是我們通常所說的硬件抽象層。硬件抽象層的設計主要是為了解決各家驅(qū)動提供商所提供的驅(qū)動標準不統(tǒng)一的問題。這些問題都由硬件抽象層來適配,為上層應用提供統(tǒng)一的API。
硬件驅(qū)動加載完成之后,可以創(chuàng)建Linux中的第一個用戶進程,也就是Init進程(pid=1)。它會孵化出adbd進程以及l(fā)ogd進程。這就是我們?yōu)槭裁纯梢赃\行時斷點調(diào)試和輸出日志的原因。就是因為這兩個守護進程的存在,Init進程執(zhí)行完成之后,它還會孵化出第一個java進程,也就是Zygote進程。Zygote進程是由init進程解析init.rc腳本創(chuàng)建的
Zygote進程,它是一個承上啟下連接java世界和native之間的一個存在。Zygote進程創(chuàng)建成功之后,就會進入到了我們的java層。它會調(diào)用ZygoteInit.java這個類,創(chuàng)建安卓framework系統(tǒng)服務SystemServer進程。后續(xù)我們所有APP的進程都是由Zygote這個進程孵化而來的。APP進程創(chuàng)建完成之后,都會由ZygoteInit反射調(diào)用APP進程的入口類ActivityThread,從而啟動APP。
ZygoteInit.main()
在ZygoteInit這個類的入口方法main方法里面,實際上還啟動了SystemServer,也就是系統(tǒng)服務進程。這個進程創(chuàng)建成功之后,也會執(zhí)行它的入口類,也就是SystemServer.java這個類的入口方法里面,又會去創(chuàng)建許多我們熟知的系統(tǒng)服務。比如說ActivityManagerService、WindowManagerService、PowerManagerService以及InputManagerService。等所有的系統(tǒng)服務都創(chuàng)建成功之后,就開始執(zhí)行Launcher這個啟動流程了。
//ZygoteInit.java
public static void main(String argv[]){
//1,預加載frameworks/base/preloaded-classes和framework_res,apk資源
preloadClasses();
preloadResources();
preloadSharedLibraries();
// 2.啟動system_server進程。該進程是framework的核心。
if(argv[1].equals("start-system-server")){
startSystemServer();
}
//3.創(chuàng)建Socket服務
registerZygoteSocket();
//4.進入阻塞狀態(tài),等待連接,用以處理來自AMS申請進程創(chuàng)建的請求
runSelectLoopMode();
}在ZygoteInit這個類的main方法里面,它主要做了以下四件事情。
第一個就是資源的預加載,加載系統(tǒng)的class文件,加載系統(tǒng)的資源文件,加載系統(tǒng)的動態(tài)庫。因為我們所開發(fā)的上層應用在運行的時候會使用到大量的系統(tǒng)資源。而如果這些系統(tǒng)資源在APP啟動的時候再去加載的話,那這勢必會造成APP啟動緩慢。而如果在系統(tǒng)啟動的時候就把這些資源文件提前預加載,就可以達到提高APP啟動速度的目的。APP在運行時,也能夠去共享使用這些資源文件。
第二個功能是通過main方法里面?zhèn)魅氲腶rgv這個數(shù)組,去判斷是否有包含"start-system-server"這個參數(shù),以決定要不要啟動SystemServer進程。這個進程是android framework的核心進程,很多service都是運行在這個進程里面的。
第三,創(chuàng)建了一個Socket服務。這個Socket的服務是用來接受來自ActivityManagerService申請進程創(chuàng)建的請求的。
Socket服務創(chuàng)建完成之后,就會進入一個阻塞狀態(tài),等待客戶端的連接。
SystemServer.main()
/frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String argv[]){
//創(chuàng)建系統(tǒng)的服務的管理者
SystemServiceManager mSystemServiceManager = new SystemServiceManager(mSystemContext);
//啟動引導服務
startBootstrapServices();
//啟動核心
startCoreServices();
//啟動其他一般服務
startOtherServices();
}SystemServer進程創(chuàng)建成功之后,也會進入它的一個入口類。它的入口類叫SystemServer.java
在它的入口方法里面啟動了非常多的系統(tǒng)服務。這些系統(tǒng)服務都交由SystemServiceManager來管理。這些系統(tǒng)服務大致上可以分為三類,引導服務以及核心服務和其他一般服務。這些具體的服務用下面示意圖來表示。



在SystemServer這個進程當中,大大小小前前后后一共會啟動110多個啟動服務。這些系統(tǒng)服務構(gòu)成了安卓的framework層,為我們的日常APP開發(fā)和運行提供了保障。
當所有的系統(tǒng)服務都啟動完成之后,在startOtherServices這個方法的最后有這樣一行代碼
mActivityManagerService.systemReady(() -> {
...
});目的是通知ActivieManager去啟動第三方應用。所以到這里,所有的系統(tǒng)服務啟動完成之后,就開始通知ActivityManagerService調(diào)用它的systemReady去啟動Launcher應用了。
總結(jié)
Android 系統(tǒng)的啟動流程可以分為以下幾個步驟:
- 通電啟動:按下電源按鈕時,硬件會開始引導啟動過程。
- 引導加載程序(Bootloader):在加電啟動后,引導加載程序(Bootloader)會運行,它是設備的第一個啟動軟件,負責初始化硬件環(huán)境、加載并啟動操作系統(tǒng)內(nèi)核。
- Linux 內(nèi)核啟動:引導加載程序會加載 Linux 內(nèi)核并啟動它。
- init 進程啟動:Linux 內(nèi)核啟動后,會執(zhí)行用戶空間的第一個進程 init,它是 Android 系統(tǒng)的初始化進程。主要做了系統(tǒng)資源的預加載,以提高APP啟動的響應速度。
- Zygote 進程啟動:在 init 進程中,會啟動 Zygote 進程,它是 Android 系統(tǒng)中應用程序進程的孵化工廠。
- SystemServer 進程啟動:Zygote 進程在啟動后,會創(chuàng)建另一個重要的進程SystemServer進程。SystemServer 是 Android 系統(tǒng)的核心服務進程,負責管理和運行系統(tǒng)級服務,如 ActivityManagerService、PackageManagerService、WindowManagerService 等。
- 啟動Launcher:到這里就看到了桌面UI了。
到此這篇關于一文帶你了解Android系統(tǒng)的啟動流程的文章就介紹到這了,更多相關Android系統(tǒng)的啟動流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android 中使用 dlib+opencv 實現(xiàn)動態(tài)人臉檢測功能
完成 Android 相機預覽功能以后,在此基礎上我使用 dlib 與 opencv 庫做了一個關于人臉檢測的 demo。接下來通過本文給大家介紹Android 中使用 dlib+opencv 實現(xiàn)動態(tài)人臉檢測功能 ,需要的朋友可以參考下2018-11-11
Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡連接狀態(tài)的改變
這篇文章主要為大家詳細介紹了Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡連接狀態(tài)的改變,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Android中的SQL查詢語句LIKE綁定參數(shù)問題解決辦法(sqlite數(shù)據(jù)庫)
這篇文章主要介紹了Android中的SQL查詢語句LIKE綁定參數(shù)問題解決辦法,本文使用的是sqlite數(shù)據(jù)庫,需要的朋友可以參考下2014-06-06
Flutter懸浮按鈕FloatingActionButton使用詳解
本文主要介紹了Flutter懸浮按鈕FloatingActionButton使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07
Android手機鬧鐘服務AlarmManagerk開發(fā)案例
這篇文章主要為大家詳細介紹了Android手機鬧鐘服務AlarmManagerk開發(fā)案例的資料,需要的朋友可以參考下2016-05-05

