Android源碼分析一 Android系統架構


一 Android系統架構

  1. Linux內核層(Linux Kernel):Android系統基於Linux2.6內核,這一層為Android設備各種硬件提供了底層驅動,如顯示驅動、音頻驅動、照相機驅動、藍牙驅動、Wi-Fi驅動、電源管理等;
  2. 硬件抽象層(android hardware abstraction layer):安卓驅動硬件的方式與Linux不盡相同。傳統Linux的驅動完全存活於內核空間。Android則在內核外部增加了硬件抽象層(HAL, Hardware Abstraction Layer),把一部分驅動功能放到HAL層中。安卓為什么費盡麻煩增加一個HAL呢?為了保護源代碼。Linux內核采用了GPL協議,所以硬件生產商想要支持Linux系統,必須遵照GPL協議公開硬件驅動的源代碼。但這些源代碼中包含有許多硬件的設計信息,牽涉到硬件生產商的核心利益。而增加了HAL層之后,硬件廠商就不需要開放所有的驅動代碼了。
  3. 系統運行庫層(libraries):這一層通過一些C/C++庫(so庫)來為Android系統提供了主要的特性支持。如SQLite庫提供了數據庫支持,OpenGL ES庫提供了3D繪圖支持,Webkit庫提供了瀏覽器內核支持等;
  4. 應用框架層(application framework):這一層主要提供構建應用程序時可能用到的各種API,Android自帶的一些核心應用就是使用這些API完成的,開發者也可通過使用API來構建自己的應用程序;
  • a) Activity Manager(活動管理器)

              管理各個應用程序生命周期以及通常的導航回退功能

  • b) Window Manager(窗口管理器)

              管理所有的窗口程序

  •  c)  Content Provider(內容提供器)

              使得不同應用程序之間存取或者分享數據

  •  d) View System(視圖系統)

              構建應用程序的基本組件

  •  e) Notification Manager(通告管理器)

              使得應用程序可以在狀態欄中顯示自定義的提示信息

  •  f) Package Manager(包管理器) 

              Android系統內的程序管理

  •  g)Telephony Manager(電話管理器)

              管理所有的移動設備功能

  •  h)Resource Manager(資源管理器)

              提供應用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等

  •  i)Location Manager(位置管理器)

             提供位置服務

  •  j)XMPP Service(XMPP服務)

             提供Google Talk服務

 

  1. 應用層(applications):這一層主要用於手機應用的安裝,如系統自帶聯系人、短信等程序,或是第三方應用程序

   6.Android運行時庫(Android Runtime)ART以上為五層五區,還有一個區域是存在於libraries層的Android運行時庫(Android Runtime)ART,它主要提供一些核心庫,能夠允許開發者使用Java語言來編寫Android應用。另外Android運行時庫中還包含了Dalvik虛擬機,它使得每一個Android應用都能運行在獨立的進程中,且擁有一個自己的Dalvik虛擬機實例。相較於Java虛擬機,Dalvik是專門為移動設備定制的,它針對手機內存、CPU性能有限等情況作了優化處理。 

 二 Android系統啟動架構圖

可以看到:Android系統啟動是從下往上的一個過程:Loader->Kernel->Native->Framework->App

Loader 層

  • Boot Rom:當手機處於關機狀態時,長按開機鍵開機,會引導芯片開始從固化在Rom里預設的代碼開始執行,然后加載引導程序到Ram.
  • Boot Loader:這是啟動Android系統之前的引導程序,主要是檢查Ram、初始化參數等功能。

Kernel 層

kernel層指的就是Android內核層,到這里才剛剛進入Android系統

  1. 啟動Kernel層的swapper進程(pid=0),系統初始化過程Kernel創建的第一個進程,用於初始化進程管理、內存管理,加載DisplayCameraBinder等驅動相關工作。
  2. 啟動kthreadd(pid=2),這是Linux系統的內核進程,會創建內核工作線程kworkder、軟中斷線程ksoftirqdthermal等內核守護進程。kthreadd是所有內核進程的鼻祖。

Native 層

這里的Native層主要包括init孵化來的用戶空間的守護進程、HAL層及開機動畫等。啟動init進程(pid=1),是Linux系統的用戶進程,init進程是所有用戶進程的鼻祖。

  • init進程會孵化出ueventdlogdhealthdinstalldadbdlmkd等用戶守護進程;
  • init進程還會啟動ServiceManager(Binder服務管家)、bootanim(開機動畫)等重要服務。
  • init進程孵化出Zygote進程,Zygote進程是Android系統第一個Java進程(虛擬機進程),zygote進程是所有Java進程的父進程。

Framework 層

framework主要包括Zygote進程SystemServer進程和MediaServer進程`。

Zygote 進程

Zygote進程是由init進程通過解析init.rc文件后fork生成的。Zygote的任務主要包括:

  1. 加載ZygoteInit類,注冊Zygote Socket服務端套接字。
  2. 加載虛擬機
  3. preloadClassses
  4. preloadResources

System Server 進程

System Server進程是由Zygote進程fork而來,System ServerZygote孵化的第一個進程。System Server負責啟動和管理整個Java Framework,包含ActivityManagerPowerManager等服務。

Media Server 進程

Media Server 進程由init進程fork而來,負責管理整個C++ Framework,包含AudioFlingerCamera Service等服務。

App 層

Zygote進程孵化出的第一個App進程是Launcher,也就是用戶看到的桌面App。同時Zygote進程還會創建BrowserPhoneEmailApp進程。也就是說所有的App進程都是由Zygote進程fork生成的。

Syscall 和 JNI

Native層和Kernel層有一個系統調用層,也就是SyscallJava層和native層之間的紐帶是JNI


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM