一室谚、Android 啟動過程
1毡鉴、啟動電源以及系統(tǒng)啟動
當(dāng)電源按下時引導(dǎo)芯片代碼從預(yù)定義的代碼可以執(zhí)行崔泵,加載BootLoader到RAM中,然后執(zhí)行眨补。
2管削、引導(dǎo)程序BootLoader
引導(dǎo)程序BootLoader是在Android操作系統(tǒng)開始運行之前的一個小程序,它的主要作用是把系統(tǒng)OS拉起來并運行撑螺。
3、Linux內(nèi)核的啟動
當(dāng)系統(tǒng)啟動時崎弃,設(shè)置緩存甘晤、計劃列表、加載驅(qū)動等饲做,在內(nèi)核完成系統(tǒng)設(shè)置后线婚,它首先在系統(tǒng)文件中尋找init.rc文件,并啟動init進(jìn)程盆均。
4塞弊、init進(jìn)程啟動
主要用來初始化和啟動屬性服務(wù),也用來啟動Zygote進(jìn)程泪姨。
二游沿、init進(jìn)程啟動總結(jié)
init進(jìn)程是Android 系統(tǒng)中用戶空間的第一個進(jìn)程,進(jìn)程號為1肮砾,是Android系統(tǒng)啟動進(jìn)程中一個關(guān)鍵的步驟诀黍,它被賦予了很多極其重要的工作職責(zé)。
init進(jìn)程啟動做了很多工作仗处,總的來說主要做了以下三件事:
1眯勾、創(chuàng)建和掛載啟動所需的文件目錄。
2婆誓、初始化和啟動屬性服務(wù)
3吃环、解析init.rc配置文件并啟動Zygote進(jìn)程。
三洋幻、Zygote進(jìn)程啟動過程
1郁轻、Zygote概述
? ? ? ? ?在Android 系統(tǒng)中,DVM(Dalvik虛擬機)和ART鞋屈、應(yīng)用程序進(jìn)程以及運行系統(tǒng)的關(guān)鍵服務(wù)的SystemServer進(jìn)程都是由Zygote進(jìn)程創(chuàng)建的范咨,我們將它稱為孵化器。它通過fock(復(fù)制進(jìn)程)的形式來創(chuàng)建應(yīng)用程序進(jìn)程和SystemServer進(jìn)程厂庇,由于Zygote進(jìn)程在啟動時會創(chuàng)建DVM或者ART,因此通過fock而創(chuàng)建的應(yīng)用程序進(jìn)程和SystemServer進(jìn)程可以在內(nèi)部獲取一個DVM或者ART的實例副本渠啊。
2、Zygote進(jìn)程的啟動
? ? ? ? init啟動Zygote時主要是調(diào)用app_main.cpp的main函數(shù)中的AppRuntime.cpp的start方法來啟動Zygote進(jìn)程的权旷。(可以app_main.cpp和AppRuntime.cpp)替蛉。
? ? ? ?在AppRuntime.cpp的start方法中贯溅,會啟動Java虛擬機、為Java虛擬機注冊JNI方法躲查、通過JNI調(diào)用ZygoteInit的main方法它浅。? 為什么要使用JNI呢?因為ZygoteInit.java是用Java語音編寫的镣煮,當(dāng)前運行的邏輯在Native中姐霍,這就需要通過JNI來調(diào)用Java。這樣Zygote就從Native層進(jìn)入了Java框架層典唇。
? ? ? ?可以閱讀ZygoteInit.java的main方法镊折。在該方法中做了四件重要的事。
a介衔、創(chuàng)建Server端的Socket恨胚,socketName的值為“zygote”
? ? ? ? ? ?zygoteServer.registerServerSocket(socketName)
? ? ? 這個Socket用于等待ActivityMangerService請求Zygote來創(chuàng)建新的應(yīng)用程序進(jìn)程。
b炎咖、預(yù)加載類和資源
? ? ? ? ? ?preload(bootTimeingsTraceLog)
c赃泡、啟動SystemServer進(jìn)程
? ? ? ? ? ?startSystemServer(...)
? ? ? ? ? ?這樣系統(tǒng)服務(wù)也會由SystemServer進(jìn)程啟動起來
d、等待AMS請求創(chuàng)建新的應(yīng)用程序進(jìn)程
? ? ? ? ? ?zygoteServer.runSelectLoop(..)
四乘盼、SystemServer處理過程
? ? ? ? ? SystemServer主要是用于創(chuàng)建系統(tǒng)服務(wù)升熊,比如AMS、WMS蹦肴、PMS都是由它創(chuàng)建的僚碎。(還是ZygoteInit.java類)
? ? ? ? ? 在啟動SystemServer時會調(diào)用ZygoteInit的zygoteInit(),在該方法中做了兩個重要的事。
1阴幌、啟動Binder線程池
? ? ? ? ZygoteInit.nativeZygoteInit()//調(diào)用native層的代碼勺阐,用來啟動Binder線程池。
啟動了Binder線程池矛双,這樣SystemServer進(jìn)程就可以使用Binder與其他進(jìn)程通信了渊抽。
2、RuntimeInit.applicationInit(...)
? ? ? ? ?進(jìn)入SystemServer的main(),在該方法中調(diào)用了run()
run()中創(chuàng)建消息Looper议忽、加載動態(tài)庫lib懒闷、創(chuàng)建SSM(SystemServerManager)
SSM會對系統(tǒng)服務(wù)進(jìn)行創(chuàng)建、啟動和生命周期的管理栈幸。
官方把系統(tǒng)服務(wù)分為三種類型:引導(dǎo)服務(wù)愤估、核心服務(wù)、其他服務(wù)速址。
創(chuàng)建Binder線程池玩焰。
創(chuàng)建SystemServiceManager,其用于對系統(tǒng)的服務(wù)進(jìn)行創(chuàng)建、啟動和生命周期管理芍锚。
啟動各種系統(tǒng)服務(wù)昔园。