Android平臺架構的介紹和原始碼分析

codeteenager發表於2018-06-27

本篇文章為Android原始碼學習的第一章,主要講述Android平臺架構的分層,以及如何下載Android原始碼。

Android平臺架構介紹

Android 是一種基於 Linux 的開放原始碼軟體棧,為廣泛的裝置和機型而建立。下圖所示為 Android 平臺的主要元件。

image
從上圖可以看出,Android系統大體可以分為6個層次,從下往上依次是:

  1. Linux核心層:Android 平臺的基礎是 Linux 核心。例如,Android Runtime (ART) 依靠 Linux 核心來執行底層功能,例如執行緒和低層記憶體管理。使用 Linux 核心可讓 Android 利用主要安全功能,並且允許裝置製造商為著名的核心開發硬體驅動程式。
  2. 硬體抽象層 (HAL):硬體抽象層 (HAL) 提供標準介面,向更高階別的 Java API 框架顯示裝置硬體功能。HAL 包含多個庫模組,其中每個模組都為特定型別的硬體元件實現一個介面,例如相機或藍芽模組。當框架 API 要求訪問裝置硬體時,Android 系統將為該硬體元件載入庫模組。
  3. Android Runtime:對於執行 Android 5.0(API 級別 21)或更高版本的裝置,每個應用都在其自己的程式中執行,並且有其自己的 Android Runtime (ART) 例項。ART 編寫為通過執行 DEX 檔案在低記憶體裝置上執行多個虛擬機器,DEX 檔案是一種專為 Android 設計的位元組碼格式,經過優化,使用的記憶體很少。編譯工具鏈(例如 Jack)將 Java 原始碼編譯為 DEX 位元組碼,使其可在 Android 平臺上執行。

ART 的部分主要功能包括:

  • 預先 (AOT) 和即時 (JIT) 編譯
  • 優化的垃圾回收 (GC)
  • 更好的除錯支援,包括專用取樣分析器、詳細的診斷異常和崩潰報告,並且能夠設定監視點以監控特定欄位

在 Android 版本 5.0(API 級別 21)之前,Dalvik 是 Android Runtime。如果您的應用在 ART 上執行效果很好,那麼它應該也可在 Dalvik 上執行,但反過來不一定。 Android 還包含一套核心執行時庫,可提供 Java API 框架使用的 Java 程式語言大部分功能,包括一些 Java 8 語言功能。 4. 原生 C/C++ 庫:許多核心 Android 系統元件和服務(例如 ART 和 HAL)構建自原生程式碼,需要以 C 和 C++ 編寫的原生庫。Android 平臺提供 Java 框架 API 以嚮應用顯示其中部分原生庫的功能。例如,您可以通過 Android 框架的 Java OpenGL API 訪問 OpenGL ES,以支援在應用中繪製和操作 2D 和 3D 圖形。 如果開發的是需要 C 或 C++ 程式碼的應用,可以使用 Android NDK 直接從原生程式碼訪問某些原生平臺庫。 5. Java API 框架:您可通過以 Java 語言編寫的 API 使用 Android OS 的整個功能集。這些 API 形成建立 Android 應用所需的構建塊,它們可簡化核心模組化系統元件和服務的重複使用,包括以下元件和服務:

  • 豐富、可擴充套件的檢視系統,可用以構建應用的 UI,包括列表、網格、文字框、按鈕甚至可嵌入的網路瀏覽器
  • 資源管理器,用於訪問非程式碼資源,例如本地化的字串、圖形和佈局檔案
  • 通知管理器,可讓所有應用在狀態列中顯示自定義提醒
  • Activity 管理器,用於管理應用的生命週期,提供常見的導航返回棧
  • 內容提供程式,可讓應用訪問其他應用(例如“聯絡人”應用)中的資料或者共享其自己的資料

開發者可以完全訪問 Android 系統應用使用的框架 API。 6. 系統應用:Android 隨附一套用於電子郵件、簡訊、日曆、網際網路瀏覽和聯絡人等的核心應用。平臺隨附的應用與使用者可以選擇安裝的應用一樣,沒有特殊狀態。因此第三方應用可成為使用者的預設網路瀏覽器、簡訊 Messenger 甚至預設鍵盤(有一些例外,例如系統的“設定”應用)。 系統應用可用作使用者的應用,以及提供開發者可從其自己的應用訪問的主要功能。例如,如果您的應用要發簡訊,您無需自己構建該功能,可以改為呼叫已安裝的簡訊應用向您指定的接收者傳送訊息。

從上圖可以將Android平臺劃分為兩層,一層是由C/C++編寫的,可以稱為Native層。另一層是由Java編寫的,可以稱為Framework層。這兩層之間的聯絡是通過JNI進行連線。

Android原始碼下載

瞭解了Android平臺架構之後,作為開發者學習原始碼,需要下載其原始碼。在下載原始碼之前,需要了解AOSP這個概念,AOSP是Android Open Source Project(Androi開源專案)的縮寫,如果可以翻牆的話,可以按照AOSP官網 https://source.android.com/setup/downloading 這個地址上的步驟進行原始碼下載,如果不具備翻牆的條件,可以在清華大學開源軟體映象站 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 進行下載。步驟如下:

安裝 Repo

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可訪問,可以用下面的:
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
複製程式碼

建立工作目錄

mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
複製程式碼

初始化倉庫

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示無法連線到 gerrit.googlesource.com,可以編輯 ~/bin/repo,把 REPO_URL 一行替換成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
## 如果需要某個特定的Android版本,則使用repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-7.1.0_r1
複製程式碼

同步原始碼樹(以後只需執行這條命令來同步)

repo sync
複製程式碼

如果中間有網路斷開的情況,則只需要執行repo sync繼續同步即可。直到下載完Android原始碼。

相關連結

Android官方文件

AOSP官網

清華大學AOSP映象地址

中國科學技術大學開源軟體映象服務

相關文章