文章目錄
- init流程簡介
- init源碼執行順序
- 執行順序
- init進程的具體工作事項
- 掛載文件系統
- 設置 SELinux
- SecondStageMain
- init.rc啟動zygote和serviceManager進程的重要性
- serviceManager工作原理
- Framework學習之系列文章
init流程簡介
下面圖片主要圍繞 Android 系統中init進程的運行機制展開介紹
init源碼執行順序
init進程是 Android 系統啟動時第一個用戶空間進程,它從執行main.cpp文件里的main函數開始運行。main函數以循環調用的方式來維持進程的持續運行,確保后續的系統初始化操作能夠逐步完成。
執行順序
- FirstStageMain
- SetupSelinux
- SecondStageMain
init進程的具體工作事項
掛載文件系統
將系統所需的各種文件系統掛載到合適的掛載點,這樣系統才能訪問和使用這些文件系統中的數據和資源。
FirstStageMain:
設置 SELinux
SELinux(Security-Enhanced Linux)是一種基于 Linux 內核的強制訪問控制(MAC)系統,init進程負責對其進行配置和初始化,以增強系統的安全性。
SetupSelinux:
SecondStageMain
下面的功能都是由SecondStageMain函數實現的。
- 啟動屬性服務:屬性服務是 Android 系統中用于存儲和管理系統屬性的服務,init進程啟動該服務后,系統的各個組件就可以通過屬性服務來獲取和設置系統屬性,PropertyInit()。
- 解析和執行腳本:除了前面提到的解析init.rc文件,init進程還會執行其他相關的腳本文件,以完成更多的系統初始化和配置工作。
解析init.rc是由LoadBootScripts函數實現:
- 循環處理腳本:通過while循環不斷處理腳本中的命令和任務,確保系統的初始化和配置工作能夠持續進行。
- 守護關鍵進程:init進程會對系統中的關鍵進程進行監控和守護,當這些進程出現異常退出時,init進程會嘗試重新啟動它們,以保證系統的穩定性。
init.rc啟動zygote和serviceManager進程的重要性
-
zygote進程:如前面所述,它是所有應用進程的父進程。通過zygote進程,系統可以快速創建新的應用進程,提高應用啟動的效率。
-
serviceManager進程:是 Android 系統里核心的系統服務注冊與發現機制 ,處于 Android Framework 層,充當服務注冊中心。它為進程間通信(IPC)提供基礎架構,允許進程注冊、查詢和使用系統服務。
init.rc中啟動servicemanager的內容:
serviceManager工作原理
- 服務注冊:應用或系統組件可將 Binder 對象作為服務注冊到 ServiceManager。比如系統服務 ActivityManagerService,通過 addService () 方法向 ServiceManager 注冊自身服務。
- 服務發現:客戶端憑借 ServiceManager 查詢所需服務的 Binder 接口。若服務存在,ServiceManager 返回對應 Binder 引用;若不存在,客戶端可選擇等待服務注冊。
- IPC 中轉:為 Android 的 Binder IPC 提供全局目錄,用于綁定客戶端和服務端。客戶端獲取 Binder 引用后,可直接與服務端通信,無需再經 ServiceManager 。
Framework學習之系列文章
Android Framework學習一:系統框架、啟動過程
Android Framework學習二:Activity創建及View繪制流程
Android Framework學習三:zygote剖析
Android Framework學習四:init進程實現
作者:帥得不敢出門