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

啟動流程

手機啟動后首先啟動進程init(用戶空間第一個進程),init進程讀取init.rc文件啟動相應(yīng)進程,system_manager(這是init進程啟動的第一個進程)、surface_flinger、media_service、zygote

一、fork機制

1、fork()系統(tǒng)調(diào)用可以有兩個返回值,如果在child進程分支調(diào)用exe()系統(tǒng)調(diào)用那么會執(zhí)行輸入路徑下的代碼

pid = fork();
if(pid == 0) {
    //child進程
} else {
    //parent進程
 }

在linux新的內(nèi)核中,epoll用來替換select,epoll最大的好處在于它不會隨著監(jiān)聽fd數(shù)目的增長而降低效率。因為內(nèi)核中的select實現(xiàn)是采用輪詢來處理的,輪詢的fd數(shù)目越多,自然耗時越多。
2、fork()采用的是寫時復(fù)制,就是在fork后不會立刻復(fù)制指令,而是在寫入的時候才會復(fù)制指令

二、zygote的native世界

1、啟動虛擬
在這里啟動虛擬機是因為zygote是所有應(yīng)用的父進程,由于寫時復(fù)制所以會提高性能
2、注冊jni方法
3、進入java世界

三、zygote的java世界

1、開啟socket通信
應(yīng)用的啟動都是通過本地socket通信實現(xiàn)的,在這里就是等待應(yīng)用進程請求創(chuàng)建進程服務(wù)
2、fork SystemService進程
創(chuàng)建系統(tǒng)服務(wù)進程PMS、AMS、WMS
3、runSelectLoop()等待客戶端請求創(chuàng)建新的進程

四、system_service的native世界

1、啟動Binder線程池,這樣就可以與其他進程進行通信
通過調(diào)用native層的代碼nativeZygoteInit方法,來啟動一個Binder線程池

五、system_service的native世界

1、啟動Binder線程池后,緊接著會進入SystemServer的main方法(可以看做是SystemServer進程的入口),在main方法中,首先會創(chuàng)建一個消息looper,緊接著便會創(chuàng)建SystemServiceManager,它會對系統(tǒng)服務(wù)進行創(chuàng)建、啟動和生命周期管理。
2、啟動各種系統(tǒng)服務(wù)
首先系統(tǒng)服務(wù)分為三種:引導(dǎo)服務(wù)、核心服務(wù)、其他服務(wù)。SystemServiceManager會依序?qū)⑺邢到y(tǒng)服務(wù)啟動起來。對應(yīng)方法為:startBootstrapServices()、startCoreServices()、startOtherServices()。
引導(dǎo)服務(wù)比如:PowerManagerService、ActivityManagerServer、PackageManagerService等
核心服務(wù)比如:BatteryService等
其他服務(wù)比如:WindowManagerService、CameraService、AlarmManagerService等

六、開啟Binder通信

1、open 打開binder驅(qū)動
2、mmap內(nèi)存映射
3、將線程注冊為binder線程
4、binder loop循環(huán)等待消息

七、啟Luancher應(yīng)用

八、zygote為什么不使用binder機制而是使用socket機制

binder機制要使用多線程,而fork創(chuàng)建對象時必須是單線程的,否則會造成死鎖

參考
https://blog.csdn.net/itachi85/article/details/54783506
https://blog.csdn.net/shaoenxiao/article/details/87088982?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1
http://www.itdecent.cn/p/327f583f970b
https://blog.csdn.net/eliot_shao/article/details/51514045
https://blog.csdn.net/qq_39037047/article/details/88066589
https://www.zhihu.com/question/312480380

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容