鳥人的Android揭祕(2)——經過啓動過程分析 Android Framework

      Android源代碼數量極其龐大,以最新的 Android 7.1 爲例,代碼數量超過 50G。若想理解和掌握如此龐大的 Android 系統,將須要耗費大量的時間和精力,付出極大的努力。關鍵是到目前爲止也沒有相對完整的資料對 Android Framework 做系統性講解說明。ios

那麼,咱們應該如何去分析 Android Framework 的代碼呢?回答這個問題以前,先回想一下一般咱們是如何分析他人編寫的代碼。在分析代碼時,通常來講咱們都會從程序的入口 main 函數開始,一點一點地理清程序的流程,掌握程序運行的過程。一樣的,在分析結構龐大的 Android Framework 代碼時,咱們也要從 Android 平臺的啓動過程入手。 Android 啓動過程包含從 Linux 內核加載到 Android Runtime 啓動再到 Launcher 應用啓動的整個過程,依次分析這一過程,有利於咱們系統地理解 Android Framework 運行的原理。git

       以下圖所示簡單描述了 Android 的啓動過程,後續章節所講解 Android Framework 的初始化過程和各模塊之間如何相互做用乖內容時,均以此圖所描述的啓動過程爲基礎。編程

 

      如下對照圖簡單地講解一下。函數

      1. Linux 內核debug

      Android 是基於 Linux 內核的系統平臺。啓動時,首先經過 bootloader (系統加載器)加載 Linux 內核。在 Linux 加載啓動時,與普通的 Linux 啓動過程相同,先初始化內核,而後調用 init 進程。日誌

      2. Init視頻

      Android init 是內核啓動後建立的第一個用戶空間進程,負責對各類設備進行初始化,運行 Android Framework 所需用的各類 Daemon、Context Manager、Media Server、Zygote等。server

      如下是 init 進程啓動的 Daemon 進程:接口

  • UEvent Daemon (ueventd):監聽內核發出的uevent建立相應的設備節點文件
  • Debuger Daemon (debuggerd):啓動Debugger系統
  • Android Debug Bridge Daemon (adbd):Android Debug Bridge鏈接管理
  • Radio Interface Layer Daemon (rild):無線通信鏈接管理
  • Log Daemon (logd):日誌管理
  • Health Daemon (healthd):系統健康管理,監聽系統電量信息

      3. Context Manager進程

      Context Manager 是一個管理 Android 系統服務的重要進程。系統服務是組成 Android Framework 的重要組成部分,提供從相機、音頻、視頻處理到各類應用程序製做所需的重要 API。

      在系統啓動時,Android 全部運行的服務都要把各自的信息註冊到 Context Manager。應用程序或 Android Framework 內部模塊在調用系統服務時,都須要先向 Context Manager 查詢服務,而後再經過 Binder IPC(interprocess communication,應用間通訊)調用相應的服務。

      4. Media Server

      Media Server 用於運行基於 C/C++ 的本地系統服務,如 Media Player Service、Resource Manager Service等。

      5. Zygote

      Zygote 進程用於縮短 Android 應用程序的加載時間。每當有 Android 程序須要執行時,Zygote 接收到請求後就會派生出一個子進程來執行應用程序。因爲 Zygote 預先加載了應用程序所需的系統資源,派生出的子進程也共享這些資源,於是節省了系統資源重複加載的時間。

      6. System Server

      System Server 是由 Zygote 進程建立一個 Android 系統的核心進程。在 System Server 中能夠看到它啓動了 Android 系統中的大部分服務,如 Vr Manager Service(管理系統VR模式切換)、Display Manager Service(支持多種顯示類型的多個顯示器的鏡像顯示)等。

      爲了將運行在 System Server 中的 Java 系統服務提供給 Android 應用程序或 Framework 內部模塊調用,須要將這些服務先註冊到 Context Manager中。

      在經過 Binder IPC 將 Java 系統服務註冊到基於 C/C++ 的服務管理器時,須要使用 JNI(Java Native Interface)編程接口。

      7. Server

      Init 進程啓動後將建立出如下本地服務:

  • Audio Server (audioserver):管理音頻輸入輸出
  • Camera Server (cameraserver):管理相機功能
  • DRM Server (drmserver):DRM(Digital Rights Management)數字版權管理
  • Media DRM Server (mediadrmserver):多媒體數字版權管理

      由 Init 進程啓動的以上服務也須要註冊到服務管理器中才能被系統其它模塊所使用,但區別於由 System Server 啓動服務的註冊方式,本地系統服務直接經過 Binder IPC 註冊便可。

      以上就是對 Android 啓動過程以及 Framework 初始化的簡單介紹,固然這僅僅是 Android 啓動過程的一部分。在全部 Java 系統服務加載完畢後,Activity Manager 會運行 Launcher 應用,繼續啓動過程。當 Launcher 應用啓動完畢後,也就能夠看到咱們熟悉的 Android 系統桌面,此部分已經超出了本文的討論範圍,讀者若有興趣請參照 Android 源代碼進行分析。

相關文章
相關標籤/搜索