亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2023年09月01日 09:16:08   作者:大神仙  
Android系統(tǒng)的啟動是一個復雜的過程,涉及到多個階段和組件,所以本文將給大家詳細的介紹一下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)文章

最新評論