一文帶你了解Android系統(tǒng)的啟動流程
系統(tǒng)啟動流程
首先是這個Loader層,當手機處于關(guān)機狀態(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了。
到此這篇關(guān)于一文帶你了解Android系統(tǒng)的啟動流程的文章就介紹到這了,更多相關(guān)Android系統(tǒng)的啟動流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實現(xiàn)網(wǎng)易云推薦歌單界面
大家好,本篇文章主要講的是Android實現(xiàn)網(wǎng)易云推薦歌單界面,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02Android?ANR分析trace文件的產(chǎn)生流程詳情
這篇文章主要介紹了Android?ANR分析trace文件的產(chǎn)生流程詳情,文章圍繞主題展開相詳細的內(nèi)容介紹,需要的朋友可以參考一下2022-07-07Android RichText 讓Textview輕松的支持富文本(圖像ImageSpan、點擊效果等等類似QQ微信聊
AndroidRichText幫助實現(xiàn)像QQ,微信一樣的,一個TextView里既有文字又有表情又有圖片的效果,采用插件化的框架,代碼簡單,可拓展性強2016-01-01Android中使用achartengine生成圖表的具體方法
這篇文章主要介紹了Android中使用achartengine生成圖表的具體方法,有需要的朋友可以參考一下2014-01-01