2022尚硅谷大數(shù)據(jù)項目實戰(zhàn)提升班-楚塞三湘接荊門九派通
Android啟動流程
2022尚硅谷大數(shù)據(jù)項目實戰(zhàn)提升班
download:https://www.51xuebc.com/thread-524-1-1.html
Android啟動流程是怎樣的?其實是指我們安卓系統(tǒng)從按下電源到顯示界面的全過程。當(dāng)我們給手機(jī)充電,按下電源,就會彈出相應(yīng)的啟動界面。等一會兒就會彈出熟悉的主界面,其實就是我們Android系統(tǒng)的整個啟動過程。
這篇文章就是想和大家聊聊我們Android系統(tǒng)啟動過程中發(fā)生的事情。
另外,這篇文章可以看作是一篇介紹文章,會出現(xiàn)很多名詞,對于不了解底細(xì)的人來說可能會比較陌生。
這里只介紹它們的名稱和功能。一些重要的流程后面會有相應(yīng)的文章。
不需要知道的,在這里可能就被刷到一邊了。請理解。
電腦是怎么啟動的?
其實組裝過電腦的人應(yīng)該知道,我們的電腦其實是由各種各樣的硬件組成的。最重要的是CPU,是用來計算的。
我們的鼠標(biāo)和鍵盤是用來輸入的。無論是2K分辨率還是1080P分辨率的顯示器,都是用來顯示圖形界面和音頻的。當(dāng)然還有一個東西叫主板。我們所有的硬件設(shè)備最終都會連接到主板上,無論是以線纜的形式,還是像CPU和內(nèi)存一樣直接插在主板上。當(dāng)我們按下電源的啟動按鈕時,我們會先執(zhí)行主板上的啟動程序。他將首先執(zhí)行一個叫做Bios的程序。如果你的電腦系統(tǒng)壞了,我們必須在Bios中重新設(shè)置啟動盤的加載路徑。一般是預(yù)裝系統(tǒng)的u盤,然后給我們的電腦重裝系統(tǒng)。
Android啟動流程
1.手機(jī)上的BIOS:引導(dǎo)加載程序
以上,電腦啟動過程。為什么要談電腦的啟動呢?因為安卓的創(chuàng)業(yè)跟它差不多。手機(jī)所有的硬件也是嵌入在手機(jī)主板里的,只是手機(jī)比電腦機(jī)箱更輕更薄。
當(dāng)我們的手機(jī)關(guān)機(jī)開機(jī)時,我們要做的第一件事就是按下電源鍵。按下電源鍵,其實就是給我們的手機(jī)主板重新上電。開機(jī)后,我們的主板會啟動一個BootLoader程序,在已經(jīng)設(shè)置好的位置加載我們的手機(jī)系統(tǒng)。這個BootLoader相當(dāng)于我們電腦的Bios。
10年前,Android剛剛興起的時候,相比ios封閉的生態(tài)系統(tǒng)。安卓系統(tǒng)的部分用戶非常喜歡做的一件事就是刷機(jī)。而且各大廠商還會為手機(jī)制作相應(yīng)的Rom包,供所有玩家使用。現(xiàn)在那個時候MIUI崛起了。那時候小米1999年還沒做第一款手機(jī),只做Rom系統(tǒng)。
當(dāng)然,不僅僅是小米一家,百度的系統(tǒng),阿里的系統(tǒng),國外CM團(tuán)隊做的系統(tǒng)都會是下一個系統(tǒng)。記得我高中的時候有一個俗稱谷歌二王子的三星i9020,是Android2.3,后來谷歌給二王子推出了自己的Android4.0的Rom包。當(dāng)時全球最早使用Android4.0的用戶是擁有i9020手機(jī)的用戶。
到時候下載Rom包放在SD卡下面。進(jìn)入BootLoader界面后,雙擊清除所有設(shè)置,然后選擇sdcard上的安裝包,等待安裝完成后再重啟??梢杂米钚碌腁ndroid4.0 .所以這個BootLoader相當(dāng)于電腦Bios。
但是現(xiàn)在的手機(jī)沒有那么多可玩性,不能更換主板的cpu,也沒有相應(yīng)的系統(tǒng)讓用戶刷手機(jī)。
2.Android的第一個進(jìn)程:空閑
Android是基于Linux內(nèi)核的手機(jī)操作系統(tǒng)。所以BootLoader啟動Android系統(tǒng)后,它啟動的第一個進(jìn)程和Linux一樣,是空閑進(jìn)程。而這個過程的PID = 0。
基于Linux系統(tǒng),很多機(jī)制都和Linux類似,比如內(nèi)核空間,用戶空間。其實這是一個比較抽象的概念。我們可以用后臺系統(tǒng)類比,方便理解。
假設(shè)你是后臺經(jīng)理。您的權(quán)限可能只是查看數(shù)據(jù)。但是您無權(quán)查看新帳戶或刪除數(shù)據(jù)。如果要查,需要獲得更高的權(quán)限,也就是俗稱的提權(quán)。
當(dāng)我們的操作系統(tǒng)運行時,為了系統(tǒng)的穩(wěn)定性。將整個內(nèi)存區(qū)域分成兩部分,一部分是系統(tǒng)運行的內(nèi)存區(qū)域。如果你想操作這個區(qū)域或者運行一些函數(shù)來修改這個內(nèi)存上的數(shù)據(jù),你必須有極高的權(quán)限。這個內(nèi)存區(qū)域也是內(nèi)核空間。另一個區(qū)域是運行一些常用程序,這個區(qū)域叫做用戶空間。反之,操作內(nèi)核空間的權(quán)限稱為內(nèi)核狀態(tài),操作用戶空間的權(quán)限稱為用戶狀態(tài)。
為什么分成這兩塊?原因是為了安全和穩(wěn)定。如果,你是一個系統(tǒng)開發(fā)人員,當(dāng)你的系統(tǒng)運行時,客戶隨機(jī)點開一個App。這個App是一個惡意程序,修改你系統(tǒng)的一些內(nèi)存數(shù)據(jù),導(dǎo)致你的系統(tǒng)崩潰崩潰。久而久之,你的操作系統(tǒng)就會失去市場。這就是為什么Linux把內(nèi)存分為用戶空間和內(nèi)核空間。
空閑的主要功能
初始化進(jìn)程和內(nèi)存管理,并加載硬件驅(qū)動程序。
創(chuàng)建一個pid=1的init進(jìn)程,這個init進(jìn)程是第一個用戶空間進(jìn)程。
創(chuàng)建一個pid=2的kthreadd進(jìn)程,該進(jìn)程被拋入內(nèi)核空間。
空閑進(jìn)程本身在內(nèi)核空間中運行。
2.內(nèi)核相關(guān)進(jìn)程:kthreadd
對于kthreadd進(jìn)程,我們其實不需要知道太多。畢竟正常開發(fā)不需要關(guān)注內(nèi)核相關(guān)代碼。我們只需要知道兩件事,
kthread = 2的進(jìn)程pid=2
內(nèi)核的相關(guān)資源就是通過這個過程創(chuàng)建的。
這個進(jìn)程及其子進(jìn)程都在內(nèi)核空間中運行。
3.一切的開始:初始化過程
Init,我們從它的名字就知道它的重要性。這個進(jìn)程也是由空閑進(jìn)程創(chuàng)建的,它的pid=1。它是屬于用戶空間的第一個進(jìn)程。
init的主要作用
這個過程的主要作用是分叉出合子過程。
4.最重要的過程:受精卵
合子英文翻譯成受精卵,我們平時啟動的所有流程都是從這個流程復(fù)制過來的。復(fù)制是指這個進(jìn)程會復(fù)制兩個完全相同的進(jìn)程,其中一個進(jìn)程繼續(xù)是合子進(jìn)程,另一個進(jìn)程在執(zhí)行完相關(guān)代碼后成為你想要啟動的進(jìn)程。但是在fork離開其他進(jìn)程之前,他要先做一些初始化,讓fork出來的進(jìn)程跟他一樣帶著這些初始化的函數(shù),而不是再初始化一次。
合子的主要功能
創(chuàng)建虛擬機(jī)
注冊JNI
啟動ZygoteServer(實際上是Socket,用于跨進(jìn)程通信)
預(yù)加載資源,然后復(fù)制的進(jìn)程已經(jīng)加載了資源。
啟動系統(tǒng)服務(wù)器
等等,一旦AMS通知了創(chuàng)建過程,這個過程就會被拆分。
合子其他
這里再多說一點。Zygote進(jìn)程本身創(chuàng)建了JVM虛擬機(jī)并注冊了JNI,這意味著我們的代碼可以真正從這里開始執(zhí)行Java代碼。以前都是C++代碼。
此外,在fork過程之前,已經(jīng)創(chuàng)建并預(yù)加載了虛擬機(jī)注冊JNI。所以我們的fork進(jìn)程從誕生開始就自帶了虛擬機(jī),注冊了JNI代碼,加載了相應(yīng)的資源。
5.勤勞的工具人:系統(tǒng)服務(wù)器
為什么說很累?因為除了上面提到的進(jìn)程,其他所有進(jìn)程都是由SystemServer創(chuàng)建的。其中AMS、WMS、PMS等重要流程都是Zygote在他的帶領(lǐng)下創(chuàng)造的。
6.黑暗中有一個村莊:發(fā)射器
你有沒有想過,我們每天滑動手機(jī)的時候,界面是什么樣的?其實就是一個App就像我們開發(fā)的手機(jī)程序一樣。只不過是安卓系統(tǒng)自動啟動的。而且,它可以顯示我們所有安裝的應(yīng)用,僅此而已。
當(dāng)我們點擊Launcher上的App圖標(biāo)時,它會與AMS進(jìn)行通信,AMS再與Zygote進(jìn)行通信。Zygote process fork創(chuàng)建了一個新的流程并執(zhí)行了相關(guān)代碼,這樣我們寫的App就創(chuàng)建好了。
結(jié)局
至此,Android的啟動過程基本完成。后面會按照相應(yīng)的重要性來解釋。此外,每章末尾還會附上幾個問題。畢竟看了一遍,只是簡單的閱讀。只有真正的思考才能真正記住。