Android系統(tǒng)啟動流程

今天谷异,我們來聊聊Android系統(tǒng)的啟動流程,了解了系統(tǒng)的啟動流程吸申,才能更好的理解系統(tǒng)的各個模塊梗劫、服務是如何有效地組織并運行的。

首先截碴,從你按下手機上的電源按鈕開始梳侨,會執(zhí)行固話在rom上的一段程序,然后就會啟動引導程序日丹,接著引導程序會啟動底層Linux系統(tǒng)走哺,Linux系統(tǒng)會啟動第一個進程-init進程。

init進程啟動

init進程干了四件事

  • 創(chuàng)建和掛載文件目錄
  • 屬性服務初始化
  • 解析init.rc文件(*)
  • 如果Zygote死亡聚凹,則重啟Zygote進程

解析init.rc文件

zygote創(chuàng)建

主要的功能聚焦在解析init.rc文件上割坠,這個文件是以一種Android初始化語言書寫,這個文件會通過command指令啟動service.cpp妒牙,在Service中通過fork方法創(chuàng)建出zygote,并啟動zygote对妄,也就是啟動路徑為/system/bin/app_process64進程湘今,對應的文件是app_main.cpp,并進入其main方法剪菱。

Dalvik或ART創(chuàng)建

app_main.cpp在main方法中又會調用AndroidRuntime.start()方法摩瞎,代碼接著就進入到了AndroidRuntime.cpp拴签,到目前為止,還在c++的世界里旗们,然后創(chuàng)建并啟動Davlik或者ART虛擬機蚓哩,注冊JNI函數,接著通過JNI方法上渴,調用Zygote的main方法岸梨,到這就由Native世界轉到了JAVA世界,緊接著在Zygote的main方法中執(zhí)行了4步操作:
1.創(chuàng)建server端的socket稠氮,用來處理與AMS請求創(chuàng)建應用程序進程交互曹阔。
2.預加載類和資源。
3.啟動system_server進程隔披。
4.執(zhí)行runselectLoop循環(huán)等待AMS請求創(chuàng)建新的應用程序進程赃份。

其中比較重要的是第3步,讓我們來細細地看一下:

SystemServer創(chuàng)建與啟動

首先Zygote中會調用startSystemServer方法奢米,先fork出SystemServer進程抓韩,接著調用handleSystemServerProcess來啟動線程,我們繼續(xù)看鬓长,首先這個方法會創(chuàng)建一個pathClassLoader谒拴,在調用ZygoteInit.zygoteInit方法,zygote方法干兩件事:
1.創(chuàng)建binder線程池
2.調用RuntimeInit.applicationInit方法

1會創(chuàng)建一個通過Native方法創(chuàng)建一個binder線程池痢士,用來跟其他進程通信使用彪薛。

再來看2,跳轉很多次怠蹂,最終在RuntimeInit的invokeStaticMain方法中使用反射創(chuàng)建一個SystemServer對象善延。
具體步驟:通過反射的getMethod方法拿到main方法的Method,并通過throw Zygote.MethodAndArgsCaller拋出一個異常城侧,這個異常在ZygoteInit的main方法中有被捕獲易遣,然后執(zhí)行mMethod.invoke調用SystemServer的main,這樣SystemServer進程就進入了SystemServer的main方法中嫌佑。

解析SystemServer進程

這里就要開始介紹SystenServer進程都干了些什么豆茫,那么自然就要從SystemServer中的main方法開始看起,里面只有一句new SystemServer().run()屋摇,我們看看這個run方法做了什么吧:
1.System.loadLibrary("android_servers")
2.創(chuàng)建 SystemServiceManager揩魂,它負責對系統(tǒng)服務進程創(chuàng)建、啟動和生命周期管理炮温。
3.啟動引導服務startBootstrapServices(ActivityManagerService火脉、PowerManagerService、PackageManagerService)
4.啟動核心服務startCoreServices(DropBoxManagerService[用于生成與管理系統(tǒng)運行時的一些日志]、BatteryService倦挂、UsageStatsService[收集用戶的使用頻率與時長]畸颅、WebViewUpdateService)
5.啟動其他服務startOtherServices(CameraService、AlarmManagerService方援、WindowManagerService没炒、LocationManagerService、InputManagerService犯戏、NotificationManagerService送火、啟動Laucher)

[注]:SystemServerManager會調用onStart方法,執(zhí)行相應的Service(例如ActivityManagerService)的main方法笛丙,并在main方法中將自己注冊到ServiceManager中漾脂,ServiceManager
用于binder通信。

Launcher啟動過程

剛剛在SystemServer進程中啟動其他服務的過程中胚鸯,通過SystemReady方法調用ActivityManagerService中的StartHomeActivityLocked方法骨稿,此方法中會創(chuàng)建一個Intent對象,用來啟動Launcher姜钳,

Launcher中應用圖標的顯示過程

首先是Launcher中的onCreate函數坦冠,創(chuàng)建一個LauncherState單例對象,通過setLauncher方法獲取到LauncherModel哥桥,其中LauncherModel持有一個Launcher對象的弱引用辙浑,LauncherModel內部有一個消息循環(huán)的線程HandlerThread對象,通過內部類LoadTask作為Message拟糕,post給HandlerThread判呕,而LoadTask本身是一個Runnable,而LoadTask中的run方法執(zhí)行內容如下:

1.loadWorkspace 加載工作區(qū)信息
2.bindWorkspace 綁定工作區(qū)信息
3.loadAllApps 加載系統(tǒng)已經安裝的應用程序信息

工作區(qū)用來描述一個抽象桌面的送滞,它由n個屏幕組成侠草,每個屏幕又分為n個單元格,每個單元格用來顯示一個應用程序的快捷圖標犁嗅。

重點在第3步边涕,加載系統(tǒng)已經安裝的應用程序,問題點在于
1.如何獲取到系統(tǒng)已經加載的應用程序信息褂微?
2.如何加載到工作區(qū)中

問題1:從loadAllApps開始里面會調用Launcher的bindAllApplications方法功蜓,傳入的參數就是系統(tǒng)安裝的應用程序的ArrayList集合,繼續(xù)追宠蚂,找到LauncherApps中的getActivityList方法式撼,該方法會調用一個aidl方法,持有的對象是使用getSystemService(Context.LAUNCHER_APPS_SERVICE)得到的求厕,也就是說使用aidl從PackageManagerService中獲取到已安裝到手機上的應用程序信息端衰。[此處有個疑問叠洗,Launcher應該是屬于SystemServer進程的甘改,而PackageManagerService作為一種服務也是屬于SystemServer進程的旅东,為何還要使用aidl呢?]

問題2:獲取到已安裝到手機上的應用程序信息后十艾,通過setApps方法抵代,使用RecycleView來展示快捷圖標。

疑問:看起來AMS忘嫉、WMS荤牍、PMS都是運行在SystemServer進程?

最后我們來總結一下Android系統(tǒng)啟動的流程庆冕,首先啟動電源康吵,引導芯片代碼從預定義的地方(固話在ROM)上加載引導程序到RAM,引導程序會啟動Linux內核访递,而Linux內核啟動會創(chuàng)建和啟動init進程晦嵌,init進程會首先fork出zygote進程,然后zygote進程也會fork出SystemServer進程拷姿,同時啟動Dalvik或者ART虛擬機惭载,然后通過一個socket等待AMS創(chuàng)建應用程序的請求,而SystemServer進程則啟動了很多服務如我們常見的AMS响巢、WMS描滔、PMS等,最后啟動Launcher作為桌面踪古,到此Android系統(tǒng)就完整地啟動了含长。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伏穆,隨后出現(xiàn)的幾起案子拘泞,更是在濱河造成了極大的恐慌,老刑警劉巖蜈出,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件田弥,死亡現(xiàn)場離奇詭異,居然都是意外死亡铡原,警方通過查閱死者的電腦和手機偷厦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燕刻,“玉大人只泼,你說我怎么就攤上這事÷严矗” “怎么了请唱?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵弥咪,是天一觀的道長。 經常有香客問我十绑,道長聚至,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任本橙,我火速辦了婚禮扳躬,結果婚禮上,老公的妹妹穿的比我還像新娘甚亭。我一直安慰自己贷币,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布亏狰。 她就那樣靜靜地躺著役纹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暇唾。 梳的紋絲不亂的頭發(fā)上促脉,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音信不,去河邊找鬼嘲叔。 笑死,一個胖子當著我的面吹牛抽活,可吹牛的內容都是我干的硫戈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼下硕,長吁一口氣:“原來是場噩夢啊……” “哼丁逝!你這毒婦竟也來了?” 一聲冷哼從身側響起梭姓,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霜幼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后誉尖,有當地人在樹林里發(fā)現(xiàn)了一具尸體罪既,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年铡恕,在試婚紗的時候發(fā)現(xiàn)自己被綠了琢感。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡探熔,死狀恐怖驹针,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情诀艰,我是刑警寧澤柬甥,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布饮六,位于F島的核電站,受9級特大地震影響苛蒲,放射性物質發(fā)生泄漏卤橄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一撤防、第九天 我趴在偏房一處隱蔽的房頂上張望虽风。 院中可真熱鬧,春花似錦寄月、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茎毁,卻和暖如春克懊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背七蜘。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工谭溉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橡卤。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓扮念,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碧库。 傳聞我的和親對象是個殘疾皇子柜与,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容