手機(jī)啟動(dòng)后首先啟動(dòng)進(jìn)程init(用戶空間第一個(gè)進(jìn)程),init進(jìn)程讀取init.rc文件啟動(dòng)相應(yīng)進(jìn)程攻晒,system_manager(這是init進(jìn)程啟動(dòng)的第一個(gè)進(jìn)程)幔嫂、surface_flinger泽疆、media_service、zygote
一虏肾、fork機(jī)制
1、fork()系統(tǒng)調(diào)用可以有兩個(gè)返回值欢搜,如果在child進(jìn)程分支調(diào)用exe()系統(tǒng)調(diào)用那么會(huì)執(zhí)行輸入路徑下的代碼
pid = fork();
if(pid == 0) {
//child進(jìn)程
} else {
//parent進(jìn)程
}
在linux新的內(nèi)核中封豪,epoll用來替換select,epoll最大的好處在于它不會(huì)隨著監(jiān)聽fd數(shù)目的增長而降低效率炒瘟。因?yàn)閮?nèi)核中的select實(shí)現(xiàn)是采用輪詢來處理的吹埠,輪詢的fd數(shù)目越多,自然耗時(shí)越多。
2缘琅、fork()采用的是寫時(shí)復(fù)制粘都,就是在fork后不會(huì)立刻復(fù)制指令,而是在寫入的時(shí)候才會(huì)復(fù)制指令
二刷袍、zygote的native世界
1驯杜、啟動(dòng)虛擬
在這里啟動(dòng)虛擬機(jī)是因?yàn)閦ygote是所有應(yīng)用的父進(jìn)程,由于寫時(shí)復(fù)制所以會(huì)提高性能
2做个、注冊jni方法
3鸽心、進(jìn)入java世界
三、zygote的java世界
1居暖、開啟socket通信
應(yīng)用的啟動(dòng)都是通過本地socket通信實(shí)現(xiàn)的顽频,在這里就是等待應(yīng)用進(jìn)程請(qǐng)求創(chuàng)建進(jìn)程服務(wù)
2、fork SystemService進(jìn)程
創(chuàng)建系統(tǒng)服務(wù)進(jìn)程PMS太闺、AMS糯景、WMS
3、runSelectLoop()等待客戶端請(qǐng)求創(chuàng)建新的進(jìn)程
四省骂、system_service的native世界
1蟀淮、啟動(dòng)Binder線程池,這樣就可以與其他進(jìn)程進(jìn)行通信
通過調(diào)用native層的代碼nativeZygoteInit方法钞澳,來啟動(dòng)一個(gè)Binder線程池
五怠惶、system_service的native世界
1、啟動(dòng)Binder線程池后轧粟,緊接著會(huì)進(jìn)入SystemServer的main方法(可以看做是SystemServer進(jìn)程的入口)策治,在main方法中,首先會(huì)創(chuàng)建一個(gè)消息looper兰吟,緊接著便會(huì)創(chuàng)建SystemServiceManager通惫,它會(huì)對(duì)系統(tǒng)服務(wù)進(jìn)行創(chuàng)建、啟動(dòng)和生命周期管理混蔼。
2履腋、啟動(dòng)各種系統(tǒng)服務(wù)
首先系統(tǒng)服務(wù)分為三種:引導(dǎo)服務(wù)、核心服務(wù)惭嚣、其他服務(wù)遵湖。SystemServiceManager會(huì)依序?qū)⑺邢到y(tǒng)服務(wù)啟動(dòng)起來。對(duì)應(yīng)方法為:startBootstrapServices()料按、startCoreServices()奄侠、startOtherServices()。
引導(dǎo)服務(wù)比如:PowerManagerService载矿、ActivityManagerServer垄潮、PackageManagerService等
核心服務(wù)比如:BatteryService等
其他服務(wù)比如:WindowManagerService烹卒、CameraService、AlarmManagerService等
六弯洗、開啟Binder通信
1旅急、open 打開binder驅(qū)動(dòng)
2、mmap內(nèi)存映射
3牡整、將線程注冊為binder線程
4藐吮、binder loop循環(huán)等待消息
七、啟Luancher應(yīng)用
八逃贝、zygote為什么不使用binder機(jī)制而是使用socket機(jī)制
binder機(jī)制要使用多線程谣辞,而fork創(chuàng)建對(duì)象時(shí)必須是單線程的,否則會(huì)造成死鎖
參考
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.reibang.com/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