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

詳解Android系統(tǒng)啟動過程

 更新時間:2021年03月30日 08:37:34   作者:kailaisi  
這篇文章主要介紹了Android系統(tǒng)啟動過程的相關(guān)資料,幫助大家更好得理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下

計算機是如何啟動的

計算機的硬件包括:CPU,內(nèi)存,硬盤,顯卡,顯示器,鍵盤鼠標(biāo)等輸入輸出設(shè)備。所有的軟件都是存放在硬盤中,程序執(zhí)行時,需要將程序從硬盤上讀取到內(nèi)存中,然后加載到CPU中來運行。當(dāng)按下開機鍵時,內(nèi)存中什么都沒有,因此需要借助某種方式,將操作系統(tǒng)加載到內(nèi)存中,而完成這項任務(wù)的就是BIOS。

引導(dǎo)階段

BIOS:BIOS是主板芯片上的一個程序,計算機通電后,第一件事情就是讀取BIOS。

BIOS首先進(jìn)行硬件檢測,檢查計算機硬件能否滿足運行的基本條件。如果硬件出現(xiàn)問題,主板發(fā)出不同的蜂鳴聲,啟動停止。如果沒有問題,屏幕會顯示CPU,內(nèi)存,硬盤等信息。

硬件自檢完成后,BIOS將控制權(quán)交給下一個階段的啟動程序。這時候BIOS需要知道下一個啟動程序存放在哪個設(shè)備中。也就是BIOS需要一個外部存儲設(shè)備的排序。優(yōu)先交給排在前面的設(shè)備。這就是我們在BIOS中設(shè)置的啟動排序。

當(dāng)?shù)谝粋€存儲設(shè)備被激活后,設(shè)備讀取設(shè)備的第一個扇區(qū),也就是前512字節(jié)。如果這512個字節(jié)的最后兩個字節(jié)是0x55和0xAA,表明設(shè)備是可以用作系統(tǒng)啟動的。如果不是,那么就會順序啟動下一個設(shè)備。

這前512個字節(jié),就叫做“主引導(dǎo)記錄”(縮寫MBR)。它負(fù)責(zé)磁盤操作系統(tǒng)對硬盤進(jìn)行讀寫時分區(qū)合法型判斷、分區(qū)引導(dǎo)信息定位。MBR不屬于任何一個CIA做系統(tǒng),它先于操作系統(tǒng)而被調(diào)入內(nèi)存,并發(fā)揮作用。然后才將控制權(quán)交給主分區(qū)內(nèi)的操作系統(tǒng),并用主分區(qū)信息來管理硬盤。

MBR主要作用是告訴計算機到硬盤的哪個位置去找操作系統(tǒng)。計算機從MBR中讀取前446字節(jié)的機器碼后,不再轉(zhuǎn)交控制權(quán),而是運行實現(xiàn)安裝的“啟動管理器”(boot loader),由用戶選擇啟動哪個操作系統(tǒng)。

加載內(nèi)核階段

選擇完操作系統(tǒng)以后,控制權(quán)交給操作系統(tǒng),操作系統(tǒng)內(nèi)核被載入內(nèi)存。

以Linux為例,先載入/boot下面的kernel。內(nèi)核加載完成后,運行第一個程序 /sbin/init。它根據(jù)配置文件產(chǎn)生init進(jìn)程。它是Linux啟動后的第一個進(jìn)程,pid為1.其他進(jìn)程都是它的后代。

然后init線程加載系統(tǒng)的各個模塊。比如:窗口程序和網(wǎng)絡(luò)程序,直至執(zhí)行/bin/login程序執(zhí)行,跳出登錄頁面,等待用戶輸入用戶名密碼。

至此,系統(tǒng)啟動完成。

Android的啟動過程

Android是基于Linux系統(tǒng)的。但是 它沒有BIOS程序,取而代之的是BootLoader(系統(tǒng)啟動加載器)。類似于BIOS,在系統(tǒng)加載前,用于初始化硬件設(shè)備,最終調(diào)用系統(tǒng)內(nèi)核準(zhǔn)備好環(huán)境。在Android中沒有硬盤,而是ROM,類似于硬盤存放操作系統(tǒng),用戶程序等。ROM跟硬盤一樣也會劃分為不同的區(qū)域,用于放置不同的程序,在Android中主要劃分為以下幾個區(qū)域:

/boot :存放引導(dǎo)程序,包括內(nèi)核和內(nèi)存操作程序
/system:相當(dāng)于電腦C盤,存放Android系統(tǒng)和系統(tǒng)應(yīng)用
/recover:回復(fù)分區(qū)??梢赃M(jìn)入該分區(qū)進(jìn)行系統(tǒng)回復(fù)
/data:用戶數(shù)據(jù)區(qū),包含了用戶的數(shù)據(jù):聯(lián)系人、短信、設(shè)置、用戶安裝的程序
/cache:安卓系統(tǒng)緩存區(qū),保存系統(tǒng)經(jīng)常訪問的數(shù)據(jù)和應(yīng)用程序
/misc:雜項內(nèi)容
/sdcard:用戶自己的存儲區(qū)域。存放照片視頻等
Android系統(tǒng)啟動跟PC相似。當(dāng)開機時,首先加載BootLoader,BootLoader會讀取ROM找到系統(tǒng)并將內(nèi)核加載進(jìn)RAM中。

當(dāng)內(nèi)核啟動后會初始化各種軟硬件環(huán)境,加載驅(qū)動程序,掛載跟文件系統(tǒng)。最后階段會啟動執(zhí)行第一個用戶空間進(jìn)程init進(jìn)程。

init進(jìn)程

init是用戶的第一個進(jìn)程,pid=1。kernal啟動后會調(diào)用/system/core/init/init.cpp的main()方法。

int main(int argc,char ** argv){
 ...
 if(is_first_stage){
  //創(chuàng)建和掛在啟動所需要的文件目錄
  mount("tmpfs","/dev","tmpfs",MS_NOSUID,"mode=0755");
  mkdir("/dev/pts",0755);
  //創(chuàng)建和掛在很多...
  ...
 } 
 ...
 //對屬性服務(wù)進(jìn)行初始化
 property_init();
 ...
 //用于設(shè)置子進(jìn)程信號處理函數(shù)(如Zygote),如果子進(jìn)程異常退出,init進(jìn)程會調(diào)用該函數(shù)中設(shè)定的信號處理函數(shù)來處理
 signal_handler_init();
 ...
 //啟動屬性服務(wù)
 start_property_service();
 ...
 //解析init.rc配置文件
 parser.ParseConfig("/init.rc");
}

首先初始化 Kernel log,創(chuàng)建一塊共享的內(nèi)存空間,加載 /default.prop 文件,解析 init.rc 文件。

init.rc 文件

init.rc 文件是 Android 系統(tǒng)的重要配置文件,位于 /system/core/rootdir/ 目錄中。 主要功能是定義了系統(tǒng)啟動時需要執(zhí)行的一系列 action 及執(zhí)行特定動作、設(shè)置環(huán)境變量和屬性和執(zhí)行特定的 service。

init.rc 腳本文件配置了一些重要的服務(wù),init 進(jìn)程通過創(chuàng)建子進(jìn)程啟動這些服務(wù),這里創(chuàng)建的 service 都屬于 native 服務(wù),運行在 Linux 空間,通過 socket 向上層提供特定的服務(wù),并以守護(hù)進(jìn)程的方式運行在后臺。

通過 init.rc 腳本系統(tǒng)啟動了以下幾個重要的服務(wù):

  • service_manager:啟動 binder IPC,管理所有的 Android 系統(tǒng)服務(wù)
  • mountd:設(shè)備安裝 Daemon,負(fù)責(zé)設(shè)備安裝及狀態(tài)通知
  • debuggerd:啟動 debug system,處理調(diào)試進(jìn)程的請求
  • rild:啟動 radio interface layer daemon 服務(wù),處理電話相關(guān)的事件和請求
  • media_server:啟動 AudioFlinger,MediaPlayerService 和 CameraService,負(fù)責(zé)多媒體播放相關(guān)的功能,包括音視頻解碼
  • surface_flinger:啟動 SurfaceFlinger 負(fù)責(zé)顯示輸出
  • zygote:進(jìn)程孵化器,啟動 Android Java VMRuntime 和啟動 systemserver,負(fù)責(zé) Android 應(yīng)用進(jìn)程的孵化工作 在這個階段你可以在設(shè)備的屏幕上看到 “Android” logo 了。

以上工作執(zhí)行完,init 進(jìn)程就會進(jìn)入 loop 狀態(tài)。

service_manager 進(jìn)程

ServiceManager 是 Binder IPC 通信過程中的守護(hù)進(jìn)程,本身也是一個 Binder 服務(wù)。ServiceManager 進(jìn)程主要是啟動 Binder,提供服務(wù)的查詢和注冊。

surface_flinger 進(jìn)程

SurfaceFlinger 負(fù)責(zé)圖像繪制,是應(yīng)用 UI 的和興,其功能是合成所有 Surface 并渲染到顯示設(shè)備。SurfaceFlinger 進(jìn)程主要是啟動 FrameBuffer,初始化顯示系統(tǒng)。

media_server 進(jìn)程

MediaServer 進(jìn)程主要是啟動 AudioFlinger 音頻服務(wù),CameraService 相機服務(wù)。負(fù)責(zé)處理音頻解析播放,相機相關(guān)的處理。

Zygote 進(jìn)程

zygote有兩個作用:啟動systemService和孵化應(yīng)用進(jìn)程。

Zygote 進(jìn)程孵化了所有的 Android 應(yīng)用進(jìn)程,是 Android Framework 的基礎(chǔ),該進(jìn)程的啟動也標(biāo)志著 Framework 框架初始化啟動的開始。

Zygote啟動主要調(diào)用app_main.cpp的main()中的AppRuntime的start方法來啟動Zygote進(jìn)程

int main(int argc,char* const argv[]){
 while( i < argc ){
  const char* arg=argv[i++];
  if(strcmp(arg,"--zygote")==0){
   //如果當(dāng)前進(jìn)程在Zygote中,則設(shè)置zygote=true
   zygote=true;
   niceName=ZYGOTE_NICE_NAME;
  }else if(strcmp(arg,"--start-system-server")==0){
   //如果當(dāng)前進(jìn)程在SystemServer中,將startSystemServer=true
   startSystemServer=true;
  }
 }
 //承接上面Init進(jìn)程中的代碼
 if(zygote){
  //啟動Zygote進(jìn)程
  runtime.start("com.android.internal.os.ZygoteInit",args,zygote);
 }
}

Zygote 服務(wù)進(jìn)程的主要功能:

  • 注冊底層功能的 JNI 函數(shù)到虛擬機
  • 預(yù)加載 Java 類和資源
  • fork 并啟動 system_server 核心進(jìn)程
  • 作為守護(hù)進(jìn)程監(jiān)聽處理“孵化新進(jìn)程”的請求

當(dāng) Zygote 進(jìn)程啟動后, 便會執(zhí)行到 frameworks/base/cmds/app_process/App_main.cpp 文件的 main() 方法。

system_server 進(jìn)程

system_server 進(jìn)程 由 Zygote 進(jìn)程 fork 而來。

//首先會調(diào)用 ZygoteInit.startSystemServer() 方法
ZygoteInit.startSystemServer() 
//fork 子進(jìn)程 system_server,進(jìn)入 system_server 進(jìn)程。
ZygoteInit.handleSystemServerProcess() 
//設(shè)置當(dāng)前進(jìn)程名為“system_server”,創(chuàng)建 PathClassLoader 類加載器。
RuntimeInit.zygoteInit() 
//重定向 log 輸出,通用的初始化(設(shè)置默認(rèn)異常捕捉方法,時區(qū)等),初始化 Zygote -> nativeZygoteInit()。
nativeZygoteInit() 
//方法經(jīng)過層層調(diào)用,會進(jìn)入 app_main.cpp 中的 onZygoteInit() 方法。
app_main::onZygoteInit()// 啟動新 Binder 線程。
applicationInit() 

//方法經(jīng)過層層調(diào)用,會拋出異常 ZygoteInit.MethodAndArgsCaller(m, argv), ZygoteInit.main() 會捕捉該異常。
ZygoteInit.main() 

//開啟 DDMS 功能,preload() 加載資源,預(yù)加載 OpenGL,調(diào)用 SystemServer.main() 方法。

SystemServer.main() 
//先初始化 SystemServer 對象,再調(diào)用對象的 run() 方法。

SystemServer.run() 
//準(zhǔn)備主線程 looper,加載 android_servers.so 庫,該庫包含的源碼在 frameworks/base/services/ 目錄下。

system_server 進(jìn)程啟動后將初始化系統(tǒng)上下文(設(shè)置主題),創(chuàng)建系統(tǒng)服務(wù)管理 SystemServiceManager,然后啟動各種系統(tǒng)服務(wù)

startBootstrapServices(); // 啟動引導(dǎo)服務(wù)
//該方法主要啟動服務(wù) ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。
//設(shè)置 ActivityManagerService,啟動傳感器服務(wù)。

startCoreServices();  // 啟動核心服務(wù)
//該方法主要
//啟動服務(wù) BatteryService 用于統(tǒng)計電池電量,需要 LightService。
//啟動服務(wù) UsageStatsService,用于統(tǒng)計應(yīng)用使用情況。
//啟動服務(wù) WebViewUpdateService。

startOtherServices();  // 啟動其他服務(wù)
//該方法主要啟動服務(wù) InputManagerService,WindowManagerService。
//等待 ServiceManager,SurfaceFlinger啟動完成,然后顯示啟動界面。
//啟動服務(wù) StatusBarManagerService,
//準(zhǔn)備好 window, power, package, display 服務(wù):
//	- WindowManagerService.systemReady()
//	- PowerManagerService.systemReady()
//	- PackageManagerService.systemReady()
//	- DisplayManagerService.systemReady()

所有的服務(wù)啟動后會注冊到ServiceManager。

ActivityManagerService 服務(wù)啟動完成后,會進(jìn)入 ActivityManagerService.systemReady(),然后啟動 SystemUI,WebViewFactory,Watchdog,最后啟動桌面 Launcher App。

最后會進(jìn)入循環(huán) Looper.loop()。

ActivityManagerService 啟動

啟動桌面 Launcher App 需要等待 ActivityManagerService 啟動完成。我們來看下 ActivityManagerService 啟動過程。

ActivityManagerService(Context) 
//創(chuàng)建名為“ActivityManager”的前臺線程,并獲取mHandler。
//通過 UiThread 類,創(chuàng)建名為“android.ui”的線程。
//創(chuàng)建前臺廣播和后臺廣播接收器。
//創(chuàng)建目錄 /data/system。
//創(chuàng)建服務(wù) BatteryStatsService。

ActivityManagerService.start() //啟動電池統(tǒng)計服務(wù),創(chuàng)建 LocalService,并添加到 LocalServices。

ActivityManagerService.startOtherServices() -> installSystemProviders()
//安裝所有的系統(tǒng) Provider。

ActivityManagerService.systemReady()
//恢復(fù)最近任務(wù)欄的 task。
//啟動 WebView,SystemUI,開啟 Watchdog,啟動桌面 Launcher App。
//發(fā)送系統(tǒng)廣播。

啟動桌面 Launcher App,首先會通過 Zygote 進(jìn)程 fork 一個新進(jìn)程作為 App 進(jìn)程,然后創(chuàng)建 Application,創(chuàng)建啟動 Activity,最后用戶才會看到桌面。

完整的啟動流程圖

源碼解析項目地址:github.com/kailaisi/an…

以上就是詳解Android系統(tǒng)啟動過程的詳細(xì)內(nèi)容,更多關(guān)于Android系統(tǒng)啟動過程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android 使用Pull方法解析XML文件的方法

    Android 使用Pull方法解析XML文件的方法

    本篇文章是對Android中使用Pull方法解析XML文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談Android插件化

    淺談Android插件化

    插件化技術(shù)最初源于免安裝運行 Apk的想法,這個免安裝的 Apk 就可以理解為插件,而支持插件的 app 我們一般叫 宿主,下面就跟著小編一起學(xué)習(xí)Android插件化吧,希望能幫助到你
    2021-09-09
  • Android多渠道打包配置方案

    Android多渠道打包配置方案

    多渠道打包,顧名思義就是用來區(qū)分同一個軟件,在不同渠道上的釋放版本,目前我們有需求是要一套軟件代碼庫多個項目共同使用,針對不同的項目打包不同的渠道apk,現(xiàn)學(xué)記錄一下,需要的朋友跟著小編一起來學(xué)習(xí)吧
    2024-06-06
  • Android外部存儲無法訪問問題解決方法

    Android外部存儲無法訪問問題解決方法

    大家好,本篇文章主要講的是Android外部存儲無法訪問問題解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Android引用開源框架通過AsyncHttpClient實現(xiàn)文件上傳

    Android引用開源框架通過AsyncHttpClient實現(xiàn)文件上傳

    這篇文章主要介紹了Android引用開源框架通過AsyncHttpClient實現(xiàn)文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android自定義鬧鐘功能

    Android自定義鬧鐘功能

    這篇文章主要為大家詳細(xì)介紹了Android自定義鬧鐘功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android 自定義可拖拽View界面渲染刷新后不會自動回到起始位置

    Android 自定義可拖拽View界面渲染刷新后不會自動回到起始位置

    這篇文章主要介紹了Android 自定義可拖拽View界面渲染刷新后不會自動回到起始位置的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Android開發(fā)之無痕過渡下拉刷新控件的實現(xiàn)思路詳解

    Android開發(fā)之無痕過渡下拉刷新控件的實現(xiàn)思路詳解

    下拉刷新效果功能在程序開發(fā)中經(jīng)常會見到,今天小編抽時間給大家分享Android開發(fā)之無痕過渡下拉刷新控件的實現(xiàn)思路詳解,需要的朋友參考下吧
    2016-11-11
  • Android?AccessibilityService?事件分發(fā)原理分析總結(jié)

    Android?AccessibilityService?事件分發(fā)原理分析總結(jié)

    這篇文章主要介紹了Android?AccessibilityService?事件分發(fā)原理分析總結(jié),AccessibilityService有很多用來接收外部調(diào)用事件變化的方法,這些方法封裝在內(nèi)部接口Callbacks中,文章圍繞AccessibilityService相關(guān)資料展開詳情,需要的朋友可以參考一下
    2022-06-06
  • Android通過LIstView顯示文件列表的兩種方法介紹

    Android通過LIstView顯示文件列表的兩種方法介紹

    過ListView顯示SD卡中的文件列表一共有兩種方法,一是:通過繼承ListActivity顯示;二是:利用BaseAdapter顯示,具體實現(xiàn)如下,感興趣的朋友可以參考下哈
    2013-06-06

最新評論