當(dāng)android上電后维蒙,首先是Boot ROM掰吕,(內(nèi)存中無(wú)法保存數(shù)據(jù))會(huì)引導(dǎo)芯片從ROM復(fù)制一段代碼(引導(dǎo)程序BootLoader)到RAM中,然后再去執(zhí)行BootLoader颅痊。BootLoader主要就是引導(dǎo)操作系統(tǒng)啟動(dòng)殖熟。
BootLoader會(huì)啟動(dòng)android的第一個(gè)進(jìn)程,就是idle進(jìn)程(pid=0)斑响,又稱swapper進(jìn)程菱属。
1、idle進(jìn)程(pid=0)
idle進(jìn)程會(huì)初始化進(jìn)程管理舰罚、內(nèi)存管理纽门,Binder驅(qū)動(dòng)、相機(jī)驅(qū)動(dòng)等)营罢。
idle進(jìn)程又會(huì)創(chuàng)建兩個(gè)進(jìn)程赏陵,一個(gè)是init進(jìn)程(pid=1),一個(gè)是kthreadd進(jìn)程(pid=2)愤钾。
2瘟滨、kthreadd進(jìn)程(pid=2)
kthreadd進(jìn)程是內(nèi)核空間的鼻祖。
3能颁、init進(jìn)程(pid=1)
init進(jìn)程是用戶空間的鼻祖
init進(jìn)程具體處理的事情:
1杂瘸、掛載和創(chuàng)建系統(tǒng)文件
2、設(shè)置selinux -- 安全策略
3伙菊、開(kāi)啟屬性服務(wù)败玉,注冊(cè)到epoll中
4、解析init.rc文件
5镜硕、進(jìn)入無(wú)限循環(huán)循環(huán)處理腳本:
①執(zhí)行action(啟動(dòng)zygote進(jìn)程等)运翼;
②檢測(cè)并重啟進(jìn)程;
③接收子進(jìn)程的SIGCHLD信號(hào)兴枯,執(zhí)行響應(yīng)的方法血淌。
init進(jìn)程會(huì)fork出zygote進(jìn)程。
4财剖、zygote進(jìn)程
zygote進(jìn)程(孵化器)是java進(jìn)程的鼻祖悠夯。
zygote進(jìn)程總結(jié):分為native層和java層。
一躺坟、native層:
執(zhí)行一個(gè)叫app_progress的可執(zhí)行文件:
1沦补、初始化android運(yùn)行時(shí)環(huán)境(ART),創(chuàng)建jvm咪橙;
2夕膀、注冊(cè)jni虚倒,建立橋梁,將java本地方法和native的方法關(guān)聯(lián)起來(lái)(native層的代碼和java代碼之間需要通過(guò)jni來(lái)通信)产舞;
3魂奥、通過(guò)jni調(diào)用java層代碼zygoteinit.main()方法。
二庞瘸、java層:
在main方法中:
1捧弃、創(chuàng)建ZygoteServer,就是socket擦囊;
2违霞、預(yù)加載app啟動(dòng)時(shí)所依賴的一些資源和類(加快app進(jìn)程啟動(dòng));
3瞬场、fork出SystemServer進(jìn)程买鸽,初始化系統(tǒng)服務(wù);
4贯被、ZygoteServer啟動(dòng)loop的死循環(huán)(zygote要一直運(yùn)行眼五,不能退出。代碼模擬殺死zygote進(jìn)程彤灶,android手機(jī)會(huì)重啟)看幼。用來(lái)接收AMS發(fā)來(lái)的消息,用于啟動(dòng)其它進(jìn)程幌陕。
zygote進(jìn)程又會(huì)進(jìn)一步fork出SystemServer進(jìn)程诵姜,
5、SystemServer進(jìn)程
在SystemServer進(jìn)程中搏熄,會(huì)啟動(dòng)很多的服務(wù)(總共有90多個(gè))棚唆。App的啟動(dòng)是由SystemServer通過(guò)AMS通知Zygote,由zygote進(jìn)程fork出一個(gè)進(jìn)程心例,啟動(dòng)app宵凌。
我們后面所學(xué)的AMS、PMS止后、WMS等這些服務(wù)都是屬于SystemServer這個(gè)進(jìn)程的瞎惫。
其他知識(shí)點(diǎn):
內(nèi)核進(jìn)程中不存在進(jìn)程、線程這樣的劃分译株。
虛擬機(jī)就是進(jìn)程中的一個(gè)模塊微饥,實(shí)現(xiàn)了內(nèi)存管理的功能。
一個(gè)進(jìn)程分為內(nèi)核空間和用戶空間古戴。每一個(gè)進(jìn)程都有自己的內(nèi)核空間和用戶空間。
進(jìn)程說(shuō)到底就是程序運(yùn)行的最小內(nèi)存單位矩肩。用戶空間里有JVM代碼现恼、native代碼等肃续。
zygote是運(yùn)行在用戶空間里的。
JVM相當(dāng)于是zygote里會(huì)創(chuàng)建一個(gè)功能模塊叉袍,這個(gè)功能模塊實(shí)現(xiàn)了內(nèi)存管理的功能始锚。