欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年09月01日 09:16:08   作者:大神仙  
Android系統(tǒng)的啟動是一個(gè)復(fù)雜的過程,涉及到多個(gè)階段和組件,所以本文將給大家詳細(xì)的介紹一下Android系統(tǒng)的啟動流程,文中也有圖片和代碼示例的講解,需要的朋友可以參考下

系統(tǒng)啟動流程

首先是這個(gè)Loader層,當(dāng)手機(jī)處于關(guān)機(jī)狀態(tài)時(shí),我們長按電源鍵它就會開機(jī)。主板通電之后,會引導(dǎo)芯片開始執(zhí)行燒錄在存儲器里的預(yù)設(shè)代碼,然后加載引導(dǎo)程序到我們的內(nèi)存中。這里主要是做一些內(nèi)存檢查和硬件參數(shù)的初始化等功能。

開機(jī)引導(dǎo)程序執(zhí)行完成之后,就會開始加載Linux Kernel的核心代碼。在這一層里面,主要是去加載一些硬件的驅(qū)動,比如我們常用的相機(jī)驅(qū)動、顯示屏驅(qū)動、輸入驅(qū)動,還有一些media服務(wù)等驅(qū)動。硬件的驅(qū)動是在Kernel這一層所加載的。但是如果說我們的上層應(yīng)用想要訪問這個(gè)硬件設(shè)備的話,都必須要通過這個(gè)Hardware Abstract Layer,也就是我們通常所說的硬件抽象層。硬件抽象層的設(shè)計(jì)主要是為了解決各家驅(qū)動提供商所提供的驅(qū)動標(biāo)準(zhǔn)不統(tǒng)一的問題。這些問題都由硬件抽象層來適配,為上層應(yīng)用提供統(tǒng)一的API。

硬件驅(qū)動加載完成之后,可以創(chuàng)建Linux中的第一個(gè)用戶進(jìn)程,也就是Init進(jìn)程(pid=1)。它會孵化出adbd進(jìn)程以及l(fā)ogd進(jìn)程。這就是我們?yōu)槭裁纯梢赃\(yùn)行時(shí)斷點(diǎn)調(diào)試和輸出日志的原因。就是因?yàn)檫@兩個(gè)守護(hù)進(jìn)程的存在,Init進(jìn)程執(zhí)行完成之后,它還會孵化出第一個(gè)java進(jìn)程,也就是Zygote進(jìn)程。Zygote進(jìn)程是由init進(jìn)程解析init.rc腳本創(chuàng)建的

Zygote進(jìn)程,它是一個(gè)承上啟下連接java世界和native之間的一個(gè)存在。Zygote進(jìn)程創(chuàng)建成功之后,就會進(jìn)入到了我們的java層。它會調(diào)用ZygoteInit.java這個(gè)類,創(chuàng)建安卓framework系統(tǒng)服務(wù)SystemServer進(jìn)程。后續(xù)我們所有APP的進(jìn)程都是由Zygote這個(gè)進(jìn)程孵化而來的。APP進(jìn)程創(chuàng)建完成之后,都會由ZygoteInit反射調(diào)用APP進(jìn)程的入口類ActivityThread,從而啟動APP。

ZygoteInit.main()

在ZygoteInit這個(gè)類的入口方法main方法里面,實(shí)際上還啟動了SystemServer,也就是系統(tǒng)服務(wù)進(jìn)程。這個(gè)進(jìn)程創(chuàng)建成功之后,也會執(zhí)行它的入口類,也就是SystemServer.java這個(gè)類的入口方法里面,又會去創(chuàng)建許多我們熟知的系統(tǒng)服務(wù)。比如說ActivityManagerService、WindowManagerService、PowerManagerService以及InputManagerService。等所有的系統(tǒng)服務(wù)都創(chuàng)建成功之后,就開始執(zhí)行Launcher這個(gè)啟動流程了。

//ZygoteInit.java
public static void main(String argv[]){
    //1,預(yù)加載frameworks/base/preloaded-classes和framework_res,apk資源
    preloadClasses();
    preloadResources();
    preloadSharedLibraries();
    // 2.啟動system_server進(jìn)程。該進(jìn)程是framework的核心。
    if(argv[1].equals("start-system-server")){
    	startSystemServer();
    }
    //3.創(chuàng)建Socket服務(wù)
    registerZygoteSocket();
    //4.進(jìn)入阻塞狀態(tài),等待連接,用以處理來自AMS申請進(jìn)程創(chuàng)建的請求
    runSelectLoopMode();
}

在ZygoteInit這個(gè)類的main方法里面,它主要做了以下四件事情。

第一個(gè)就是資源的預(yù)加載,加載系統(tǒng)的class文件,加載系統(tǒng)的資源文件,加載系統(tǒng)的動態(tài)庫。因?yàn)槲覀兯_發(fā)的上層應(yīng)用在運(yùn)行的時(shí)候會使用到大量的系統(tǒng)資源。而如果這些系統(tǒng)資源在APP啟動的時(shí)候再去加載的話,那這勢必會造成APP啟動緩慢。而如果在系統(tǒng)啟動的時(shí)候就把這些資源文件提前預(yù)加載,就可以達(dá)到提高APP啟動速度的目的。APP在運(yùn)行時(shí),也能夠去共享使用這些資源文件。

第二個(gè)功能是通過main方法里面?zhèn)魅氲腶rgv這個(gè)數(shù)組,去判斷是否有包含"start-system-server"這個(gè)參數(shù),以決定要不要啟動SystemServer進(jìn)程。這個(gè)進(jìn)程是android framework的核心進(jìn)程,很多service都是運(yùn)行在這個(gè)進(jìn)程里面的。

第三,創(chuàng)建了一個(gè)Socket服務(wù)。這個(gè)Socket的服務(wù)是用來接受來自ActivityManagerService申請進(jìn)程創(chuàng)建的請求的。

Socket服務(wù)創(chuàng)建完成之后,就會進(jìn)入一個(gè)阻塞狀態(tài),等待客戶端的連接。

SystemServer.main()

/frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String argv[]){
    //創(chuàng)建系統(tǒng)的服務(wù)的管理者
    SystemServiceManager mSystemServiceManager = new SystemServiceManager(mSystemContext);
    //啟動引導(dǎo)服務(wù)
    startBootstrapServices();
    //啟動核心
    startCoreServices();
    //啟動其他一般服務(wù)
    startOtherServices();
}

SystemServer進(jìn)程創(chuàng)建成功之后,也會進(jìn)入它的一個(gè)入口類。它的入口類叫SystemServer.java

在它的入口方法里面啟動了非常多的系統(tǒng)服務(wù)。這些系統(tǒng)服務(wù)都交由SystemServiceManager來管理。這些系統(tǒng)服務(wù)大致上可以分為三類,引導(dǎo)服務(wù)以及核心服務(wù)和其他一般服務(wù)。這些具體的服務(wù)用下面示意圖來表示。

在SystemServer這個(gè)進(jìn)程當(dāng)中,大大小小前前后后一共會啟動110多個(gè)啟動服務(wù)。這些系統(tǒng)服務(wù)構(gòu)成了安卓的framework層,為我們的日常APP開發(fā)和運(yùn)行提供了保障。

當(dāng)所有的系統(tǒng)服務(wù)都啟動完成之后,在startOtherServices這個(gè)方法的最后有這樣一行代碼

mActivityManagerService.systemReady(() -> {
	...
});

目的是通知ActivieManager去啟動第三方應(yīng)用。所以到這里,所有的系統(tǒng)服務(wù)啟動完成之后,就開始通知ActivityManagerService調(diào)用它的systemReady去啟動Launcher應(yīng)用了。

總結(jié)

Android 系統(tǒng)的啟動流程可以分為以下幾個(gè)步驟:

  • 通電啟動:按下電源按鈕時(shí),硬件會開始引導(dǎo)啟動過程。
  • 引導(dǎo)加載程序(Bootloader):在加電啟動后,引導(dǎo)加載程序(Bootloader)會運(yùn)行,它是設(shè)備的第一個(gè)啟動軟件,負(fù)責(zé)初始化硬件環(huán)境、加載并啟動操作系統(tǒng)內(nèi)核。
  • Linux 內(nèi)核啟動:引導(dǎo)加載程序會加載 Linux 內(nèi)核并啟動它。
  • init 進(jìn)程啟動:Linux 內(nèi)核啟動后,會執(zhí)行用戶空間的第一個(gè)進(jìn)程 init,它是 Android 系統(tǒng)的初始化進(jìn)程。主要做了系統(tǒng)資源的預(yù)加載,以提高APP啟動的響應(yīng)速度。
  • Zygote 進(jìn)程啟動:在 init 進(jìn)程中,會啟動 Zygote 進(jìn)程,它是 Android 系統(tǒng)中應(yīng)用程序進(jìn)程的孵化工廠。
  • SystemServer 進(jìn)程啟動:Zygote 進(jìn)程在啟動后,會創(chuàng)建另一個(gè)重要的進(jìn)程SystemServer進(jìn)程。SystemServer 是 Android 系統(tǒng)的核心服務(wù)進(jìn)程,負(fù)責(zé)管理和運(yùn)行系統(tǒng)級服務(wù),如 ActivityManagerService、PackageManagerService、WindowManagerService 等。
  • 啟動Launcher:到這里就看到了桌面UI了。

到此這篇關(guān)于一文帶你了解Android系統(tǒng)的啟動流程的文章就介紹到這了,更多相關(guān)Android系統(tǒng)的啟動流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論