App啓動流程底層詳解

首先應該說一下linux的啓動流程 或者設計說一下系統的啓動流程。
首先不管是什麼系統 啓動流程都是一樣的 ![系統啓動流程](https://img-
系統啓動
總的來說,linux系統啓動流程可以簡單總結爲以下幾步:
1)開機BIOS自檢,加載硬盤。
2)讀取MBR,進行MBR引導。
3)grub引導菜單(Boot Loader)。
4)加載內核kernel。
5)啓動init進程,依據inittab文件設定運行級別
6)init進程,執行rc.sysinit文件。
7)啓動內核模塊,執行不同級別的腳本程序。
根據需要運行的程序 來設置運行級別 確定要運行哪些
8)執行/etc/rc.d/rc.local
9)啓動mingetty,進入系統登陸界面。

Android 衆多基於Linux內核的系統類似, 啓動系統時, bootloader啓動內核和init進程. init進程分裂出更多名爲"daemons(守護進程)"的底層的Linux進程, 諸如android debug deamon, USB deamon等. 這些守護進程處理底層硬件相關的接口.隨後, init進程會啓動一個非常有意思的進程—“Zygote”. 顧名思義, 這是一個Android平臺的非常基礎的進程. 這個進程初始化了第一個VM, 並且預加載了framework和衆多App所需要的通用資源. 然後它開啓一個Socket接口來監聽請求, 根據請求孵化出新的VM來管理新的App進程. 一旦收到新的請求, Zygote會基於自身預先加載的VM來孵化出一個新的VM創建一個新的進程.

關鍵是: 進程是在被需要的時候才創建的.

當你點擊了一個app圖標,系統首先通過Binderipc機制 ,
ServiceManager進程通過binder 啓動ActivityManagerService. 該Service會執行如下操作:
Click事件會調用startActivity(Intent), 會通過Binder IPC機制, 最終調用到ActivityManagerService. 該Service會執行如下操作:

	第一步通過PackageManager的resolveIntent()收集這個intent對象的指向信息.
	指向信息被存儲在一個intent對象中.
	下面重要的一步是通過grantUriPermissionLocked()方法來驗證用戶是否有足夠的權限去調用該						intent對象指向的Activity.
如果有權限, ActivityManagerService會檢查並在新的task中啓動目標activity.
現在, 是時候檢查這個進程的ProcessRecord是否存在了.
如果ProcessRecord是null, ActivityManagerService會創建新的進程來實例化目標activity.

最初我們啓動Launcher中的圖標時,進去app第一個ac,和我們在開發中跳轉到新的ac是一樣的,而其中acvivitymanagerservice 就是負責管理通信的。
ActivityManagerService 作爲一個守護進程運行在 Android Framework 中,如果讓開發者直接接觸這個類的話,就需要開發者自行處理 IPC 調用的問題,且這有不利於 Android 系統進行安全校驗等工作。因而 Android 系統實現了 ActivityManager,通過這個 ActivityManager 作爲一個入口,變相地和 ActivityManagerService 打交道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章