Android系統(tǒng)啟動(dòng)過(guò)程分析

一概述

(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)時(shí)序圖.png

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)程分析

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

相關(guān)閱讀更多精彩內(nèi)容

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