Android 系統啓動流程

概述

站在巨人的肩膀上學習,本片博客參考 gityuan,用於筆記和鞏固知識node

Android 架構

在這裏插入圖片描述
這個是Google官方提供的經典的分層架構圖,從下向上依次是, Linux內核HAL系統Native庫和Android RuntimeJava框架層應用層,其中每一層都有若干的子模塊和子系統

Google提供的5層很經典,可是爲了更進一步的透視Android 系統架構,以進程的視角,以分層的架構,來詮釋Android的全貌,詮釋Android 全貌的內在聯繫linux

Android 啓動架構圖

在這裏插入圖片描述

Android 系統啓動過程由上圖從下向上的一個過程,由Boot Loader引導開機,而後依次進入Kernel -> Native-> Framework-> App,下面簡要介紹這幾個過程android

開機(關於Loader層)git

  • Boot ROM:當手機處於關機的狀態,長按Power鍵開機,引導芯片從固化在ROM裏預設的代碼開始執行,而後加載程序到RAM
  • Boot Loader:這是啓動Android系統以前的引導程序,主要是檢查RAM,初始化硬件參數等工能

關於Kernel (Linux內核層)安全

Android 平臺的基礎是Linux內核,好比ART虛擬機最終調用的是Linux內核執行的功能,Linux內核的安全機制爲Android提供相應的保障,也容許設備製造商爲內核開發硬件驅動程序多線程

  • 啓動Kernel的swapper進程(pid=0),該進程又稱爲idle進程,系統初始化過程Kernel從無到有,開創的第一個進程,用於初始化進程管理,內存管理,加載Display,Camera Driver,Binder Driver,等相關工做
  • 啓動kthreadd進程(pid=2),是Linux的內核進程,會建立內核工做線程kworkder,軟中斷線程ksoftirqd,thermal等內核守護進程,kthreadd進程是全部內核進程的鼻祖

關於硬件抽閒層(HAL)架構

硬件抽象層(HAL)提供標準接口,HAL包括多個庫模塊,每一個模塊都爲特定的硬件組件實現一組接口,好比Wifi/藍牙模塊,當框架API請求訪問硬件時,Android系統將爲該硬件加載相應的庫模塊app

Android Runtime 和 系統庫框架

每一個應用都在本身的進程中運行,都有本身的虛擬機實例,ART經過執行dex文件可在設備能運行多個虛擬機,DEX文件是專門爲Android設計的字節碼格式,通過優化使用的內存很小,ART主要包括的工能是,預先(AOT)和即時(JIT)編譯 ,優化垃圾回收(GC),以及調試相關支持oop

這裏的Native系統庫主要包括,init孵化來的用戶空間的守護進程,HAL層以及開機動畫等,啓動init進程(pid=1),是Linux系統的用戶進程,init進程是全部用戶進程的鼻祖

  • init進程會孵化出,ueventd、logd、healthd、installd、adbd、lmkd等用戶守護進程
  • init進程還啓動了ServiceManager(Binder的管家),bootanim(開機動畫)等重要服務
  • init 進程還孵化除了Zygote進程,Zygote進程是Android中的第一個Java進程(即虛擬機進程),Zygote是全部Java進程的父進程,Zygote進程自己就是init進程孵化出來的

Framework層

  • Zygote進程,是由init進程經過解析init.rc文件後fork生成的,Zygote進程主要包括
    • 加載Zygoteinit類,註冊Zygote Socket服務端套接字
    • 加載虛擬機
    • 提早加載類PreloadClasses
    • 提早加載資源PreLoadResouces
  • System Server 進程,是由Zygote fork而來,System Server是Zygote孵化出的第一個進程,System Server 負責啓動和管理整個Java FrameWork,包含ActivityManagerService, WorkManagerService,PagerManagerService,PowerManagerService等服務
  • Media Server 進程,是由init fork而來,負責啓動和管理整個C++FrameWork,包含AudioFlinger,Camera Service等

App層

  • Zygote 孵化出的第一個App進程是Launcher,這是用戶看到的桌面App
  • Zygote 還會建立出Browser,Phone,Email等App進程,每一個App至少運行在一個進程上
  • 全部的App進程都是由Zygote fork而成

Syscall && JNI

  • Native 和 KerNel之間有一層系統調用(Syscall)
  • Java 層和Native層之間的紐帶JNI

重要的進程

在這裏插入圖片描述
Android 系統中極其重要的進程, initZygote, ServiceMager, system_server

init 進程

  • Linux系統中用戶空間的第一個進程init.main

  • init進程還啓動了ServiceManager進程(Binder的管家),bootanim(開機動畫)等重要服務

  • init 進程還孵化除了Zygote進程Zygote進程是Android中的第一個Java進程(即虛擬機進程)Zygote是全部Java進程的父進程,Zygote進程自己就是init進程孵化出來的

Zygote進程

  • 全部App的父進程,ZygoteInit.main

  • Zygote進程,是由init進程經過解析init.rc文件後fork生成的,Zygote進程主要包括

    • 加載Zygoteinit類,註冊Zygote Socket服務端套接字
    • 加載虛擬機
    • 提早加載類PreloadClasses
    • 提早加載資源PreLoadResouces
  • system_server進程,是由Zygote fork而來,System Server是Zygote孵化出的第一個進程,System Server 負責啓動和管理整個Java FrameWork,包含ActivityManagerService, WorkManagerService,PagerManagerService,PowerManagerService等服務

system_server進程

系統各大服務的載體, SystemServer.main system_server進程從源碼角度來看能夠分爲,引導服務,核心服務和其餘服務

  • 引導服務(7個):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;
  • 核心服務(3個):BatteryService、UsageStatsService、WebViewUpdateService;
  • 其餘服務(70個+):AlarmManagerService、VibratorService等。

ServiceManger進程

bInder服務的大管家

ServiceManager 是Binder IPC通訊過程當中的守護進程,自己也是一個Binder,可是並無採用多線程模型來跟Binder通訊,而是自行編寫了binder.c直接和Binder驅動來通訊,而且只有一個binder_loop來讀取和處理事務,這樣作的好處是簡單和高效 ServiceManager自己工做相對簡單,其工能查詢和註冊服務

流程圖

在這裏插入圖片描述
ServiceManager 集中管理系統內的全部服務,通能過權限控制進程是否有權註冊服務,經過字符串來查找是否有對應的Service,因爲ServiceManager進程註冊了Service的死亡通知,那麼服務所在的進程死亡後,只需告訴ServiceManager,每一個Client經過查詢ServiceManager能夠獲取Service的狀況

啓動主要包括如下幾個階段

  • 打開Binder驅動,並調用mmap()方法分配128k的內存映射空間,binder_open
  • 註冊成爲Binder服務的大管家binder_become_context_manager
  • 驗證selinux權限,判斷進程是否有權註冊查看指定服務
  • 進入無限循環,處理Client發來的請求 binder_loop
  • 根據服務的名稱註冊服務,重複註冊會移除以前的註冊信息
  • 死亡通知,當所在進程死亡後,調用binder_release方法,而後調用binder_node_release,這個過程發出死亡通知回調

App進程

  • 經過Process.start啓動的App進程ActivityThread.main
  • Zygote 孵化出的第一個App進程是Launcher,這是用戶看到的桌面App
  • Zygote 還會建立出BrowserPhoneEmail等App進程,每一個App至少運行在一個進程上
  • 全部的App進程都是由Zygote fork而成

進程與線程的區別

進程:每一個App啓動前必須先建立一個進程,該進程是由Zygote fork出來,進程具備獨立的資源空間,用於承載App運行的各類Activity/Service組件,進程對於上層的應用層來講是徹底透明的,這也是Google刻意爲之,讓App程序都運行在Android Runtime,大多數狀況一個App運行在一個進程中,除非在AndroidManifest.xml文件中配置了Android:process,或者經過Native代碼fork進程

線程:線程對於咱們來講比較熟悉,好比每次new Thread().start,都會建立一個新的線程,該線程沒有本身的獨立空間,而是與所在的進程資源共享,從Linux來講,進程與線程都是task_struct結構體,除了是否資源共享外,沒有任何區別

看一下進程建立的過程

在這裏插入圖片描述

  • App發起進程:若是從桌面啓動應用,則發起進程即是Launcher所在的進程,當從某App啓動遠程進程,則發起進程是App所在的進程,發起進程首先須要經過Binder發送信息給system_server進程
  • system_server進程:調用Process.start方法,經過Socket向Zygote進程發送新建進程的請求
  • zygote進程:在執行ZygoteInit.main()後進入runSelectLoop()循環體,當有客戶端鏈接時,便會執行ZygoteConnection.runOnce()方法,再通過層層調用後fork出新的應用進程
  • 新進程:執行handleChildProc方法,設置進程名,打開binder驅動,啓動新的binder線程,設置art虛擬機參數,反射目標類的main方法,即調用ActivityThread.main()方法

Process.start()方法是阻塞方法,等待直到進程建立完成返回響應的pid,才完成該方法

在這裏插入圖片描述
相關文章
相關標籤/搜索