我們在按下電源鍵到開機整個過程中系統(tǒng)是如何啟動的呢
1.加載bootloader
按下電源時引導芯片代碼從預定義的地方(固定rom)開始執(zhí)行,加載引導程序bootloader到RAM執(zhí)行
2.Linux內(nèi)核啟動
bootloader是Android系統(tǒng)運行前的一個小程序,目的是將系統(tǒng)os拉起來
3.啟動init進程
Linux內(nèi)核啟動后,經(jīng)過一系列系統(tǒng)設置并查找init.rc文件解析并啟動init進程,init進程會初始化和啟動屬性服務,掛載目錄,啟動Zygote進程
4.Zygote進程啟動
Zygote進程會創(chuàng)建Dvm,創(chuàng)建服務端socket等待ActivityManagerService請求Zygote創(chuàng)建新的應用程序進程,啟動SystemServer進程
5.SystemServer進程啟動
SystemServer進程啟動Binder線程池來進行進程間通信,創(chuàng)建SystemServiceManager啟動各種系統(tǒng)服務
6.啟動Launcher
Launcher啟動后會將已安裝的應用程序圖標顯示在桌面上
啟動流程圖如下:
Binder線程池
Android進程間通信使用Binder機制,binder線程池用來進程間通信的
SystemServer進程
用來創(chuàng)建和管理各種系統(tǒng)服務如AMS,PMS等
Android系統(tǒng)啟動何時進入Java框架層的呢?
init進程啟動是通過app_main.cpp的main方法啟動的,在main方法中通過AppRuntime的start方法啟動init進,ApRuntime繼承AndroidRuntime,在AndroidRuntime的start方法中用JNI的方式調(diào)用了ZygoteInit的main方法,此時就進入了Java框架層.
感謝
http://www.reibang.com/p/46d9d625563a
http://www.reibang.com/p/1d3e722871e8
https://blog.csdn.net/itachi85/article/details/56669808