Android系統全貌

小編發表於2017-01-04

轉自Gityuan的Android開篇,對自我學習作進一步整理。

Android系統以Linux核心作為基底,上層採用Native層Java層。系統分為核心空間和使用者空間,並通過系統呼叫(Syscall)連通。使用者空間主要採用C++和Java程式碼實現,通過JNI技術連通Java層和Native層(C/C++)。

Android系統全貌
圖片來源 [GITYUAN](http://gityuan.com/android/)

Loader層

  • Boot ROM: 電源按下,引導晶片程式碼開始從預定義的地方(固化在ROM)開始執行.載入載入程式到RAM,然後執行.
  • Boot Loader: 這是Android系統系統之前的載入程式,主要用來檢測外部的RAM以及設定網路、記憶體、初始化硬體引數等.

Kernel層

Kernel層是指Android核心層,到這裡才剛剛開始進入Android系統。

  • 啟動Kernelswapper程式(pid=0):該程式又稱為idle程式, 系統初始化過程Kernel由無到有開創的第一個程式, 用於初始化程式管理、記憶體管理,載入Display,Camera Driver,Binder Driver等相關工作(圖中kernel層藍色區塊);
  • 啟動kthreadd程式(pid=2):是Linux系統的核心程式,會建立核心工作執行緒kworkder,軟中斷執行緒ksoftirqd,thermal等一系列核心守護程式。kthreadd程式是所有核心程式的父程式。

Linux核心載入主要包括初始化kernel核心(記憶體初始化,開啟中斷,初始化程式表等)、初始化驅動、啟動核心後臺(daemons)執行緒、安裝根(root)檔案系統等。後續啟動第一個使用者級程式init(pid=1).

Native層

Native層主要包括啟動init程式Android的第一個使用者空間程式)、HAL層硬體抽象層)以及開機動畫等。init程式是所有使用者程式的鼻祖。同時init程式也會孵化一系列使用者程式,還會啟動關鍵的服務以及孵化Zygote程式

  • init程式會孵化出ueventd、logd、healthd、installd、adbd、lmkd等使用者守護程式;
  • init程式還啟動servicemanager(binder服務管家)、bootanim(開機動畫)等重要服務
  • init程式孵化出Zygote程式Zygote程式是Android系統的第一個Java程式Zygote是所有Java程式的父程式Zygote程式本身是由init程式孵化而來的。
  • kthreadd程式: 是所有核心程式的父程式
  • init程式 : 是所有使用者程式的父程式(或者父父程式)
  • zygote程式 : 是所有上層Java程式的父程式,另外zygote的父程式是init程式。

Framework層

如圖,Framework層分為Java FramewordC++ Framework,分別由system_server程式media_server程式負責啟動和管理。

Zygote本身是一個Native的應用程式,剛開始的名字為“app_process”,執行過程中,通過系統呼叫將自己名字改為Zygote。在圖中的紅色線,便是Zygote fork出來的程式,所有的App程式都是由Zygote fork產生的。

Android系統全貌
image.png

  • Zygote程式,是由init程式通過解析init.rc檔案後fork生成的,Zygote程式主要包含:
    載入ZygoteInit類,註冊Zygote Socket服務端套接字;
    載入虛擬機器;
    preloadClasses;
    preloadResouces。
  • System Server程式,是由Zygote程式fork而來,System Server是Zygote孵化的第一個程式,System Server負責啟動和管理整個Java framework,包含ActivityManager,PowerManager等服務。
  • 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

Andorid的啟動過程
Android程式整理

相關文章