一概述
(1)開(kāi)機(jī)系統(tǒng)啟動(dòng)時(shí),從預(yù)定義的地方開(kāi)始執(zhí)行代碼,加載引導(dǎo)程序BootLoader到ARM,它是Android操作系統(tǒng)開(kāi)始運(yùn)行前的程序,負(fù)責(zé)把系統(tǒng)OS拉起來(lái)并運(yùn)行。
(2)接下來(lái),Linux內(nèi)核啟動(dòng),設(shè)置緩存、被保護(hù)存儲(chǔ)器、計(jì)劃列表,加載驅(qū)動(dòng),完成初始設(shè)置,最后在系統(tǒng)文件中尋找名為init.rc的文件,啟動(dòng)init進(jìn)程。
二init進(jìn)程分析
/system/core/init/init.cpp
main函數(shù)是該進(jìn)程的入口函數(shù),它的主要工作是創(chuàng)建和掛載啟動(dòng)所需的目錄文件比如:tmpfs、devpts、proc 、sysfs 等系統(tǒng)運(yùn)行時(shí)目錄。啟動(dòng)屬性服務(wù),設(shè)置子進(jìn)程型號(hào)處理函數(shù),用以防止子進(jìn)程成為僵尸進(jìn)程(比如子進(jìn)程由于某種原因,終止運(yùn)行,而父進(jìn)程不知,仍然保存子進(jìn)程狀態(tài)等信息),啟動(dòng)Zygote進(jìn)程。
int main(int argc, char** argv){
...//部分代碼
Parser& parser = Parser::GetInstance();
parser.AddSectionParser("service",std::make_unique<ServiceParser>());
parser.AddSectionParser("on", std::make_unique<ActionParser>());
parser.AddSectionParser("import", std::make_unique<ImportParser>());
std::string bootscript = GetProperty("ro.boot.init_rc", "");
if (bootscript.empty()) {
parser.ParseConfig("/init.rc");
parser.set_is_system_etc_init_loaded(
parser.ParseConfig("/system/etc/init"));
parser.set_is_vendor_etc_init_loaded(
parser.ParseConfig("/vendor/etc/init"));
parser.set_is_odm_etc_init_loaded(parser.ParseConfig("/odm/etc/init"));
} else {
parser.ParseConfig(bootscript);
parser.set_is_system_etc_init_loaded(true);
parser.set_is_vendor_etc_init_loaded(true);
parser.set_is_odm_etc_init_loaded(true);
}
}
注意:android 8.0中堆init.rc文件進(jìn)行了拆分,每個(gè)服務(wù)對(duì)應(yīng)一個(gè)rc文件。
Zygote進(jìn)程啟動(dòng)
在Android系統(tǒng)中,應(yīng)用進(jìn)程以及系統(tǒng)服務(wù)的SystemServer進(jìn)程都是由Zygote進(jìn)程通過(guò)fock自身的形式創(chuàng)建(Zygote在啟動(dòng)時(shí)會(huì)創(chuàng)建DVM或ART,因此擁有它們的實(shí)例,fock后的進(jìn)程可以直接得到這個(gè)實(shí)例副本)。

Zygote啟動(dòng)主要做了以下5件事:
(1).創(chuàng)建AppRuntime并調(diào)用其start方法,啟動(dòng)Zygote進(jìn)程
(2).創(chuàng)建Java虛擬機(jī),注冊(cè)JNI
(3).通過(guò)JNI調(diào)用Zygote的main函數(shù)進(jìn)入Zygote的Java層
(4).調(diào)用registerZygoteSocket()創(chuàng)建服務(wù)端Socket,通過(guò)funSelectLoop等待AMS的請(qǐng)求創(chuàng)建新的應(yīng)用程序進(jìn)程
(5).啟動(dòng)SystemServer進(jìn)程
SystemServer進(jìn)程非常重要,眾所周知的AMS、PMS、WMS等都是它創(chuàng)建,啟動(dòng)的。
請(qǐng)看下一篇文章:SystemServer進(jìn)程分析