本篇文章為Android源碼學(xué)習(xí)的第一章西剥,主要講述Android平臺(tái)架構(gòu)的分層渗磅,以及如何下載Android源碼旗扑。
Android平臺(tái)架構(gòu)介紹
Android 是一種基于 Linux 的開放源代碼軟件棧殊校,為廣泛的設(shè)備和機(jī)型而創(chuàng)建芦疏。下圖所示為 Android 平臺(tái)的主要組件肢预。
從上圖可以看出矛洞,Android系統(tǒng)大體可以分為6個(gè)層次,從下往上依次是:
- Linux內(nèi)核層:Android 平臺(tái)的基礎(chǔ)是 Linux 內(nèi)核。例如沼本,Android Runtime (ART) 依靠 Linux 內(nèi)核來執(zhí)行底層功能噩峦,例如線程和低層內(nèi)存管理。使用 Linux 內(nèi)核可讓 Android 利用主要安全功能抽兆,并且允許設(shè)備制造商為著名的內(nèi)核開發(fā)硬件驅(qū)動(dòng)程序识补。
- 硬件抽象層 (HAL):硬件抽象層 (HAL) 提供標(biāo)準(zhǔn)界面,向更高級(jí)別的 Java API 框架顯示設(shè)備硬件功能辫红。HAL 包含多個(gè)庫模塊凭涂,其中每個(gè)模塊都為特定類型的硬件組件實(shí)現(xiàn)一個(gè)界面,例如相機(jī)或藍(lán)牙模塊贴妻。當(dāng)框架 API 要求訪問設(shè)備硬件時(shí)切油,Android 系統(tǒng)將為該硬件組件加載庫模塊。
- Android Runtime:對(duì)于運(yùn)行 Android 5.0(API 級(jí)別 21)或更高版本的設(shè)備名惩,每個(gè)應(yīng)用都在其自己的進(jìn)程中運(yùn)行澎胡,并且有其自己的 Android Runtime (ART) 實(shí)例。ART 編寫為通過執(zhí)行 DEX 文件在低內(nèi)存設(shè)備上運(yùn)行多個(gè)虛擬機(jī)娩鹉,DEX 文件是一種專為 Android 設(shè)計(jì)的字節(jié)碼格式攻谁,經(jīng)過優(yōu)化,使用的內(nèi)存很少弯予。編譯工具鏈(例如 Jack)將 Java 源代碼編譯為 DEX 字節(jié)碼巢株,使其可在 Android 平臺(tái)上運(yùn)行。
ART 的部分主要功能包括:
- 預(yù)先 (AOT) 和即時(shí) (JIT) 編譯
- 優(yōu)化的垃圾回收 (GC)
- 更好的調(diào)試支持熙涤,包括專用采樣分析器阁苞、詳細(xì)的診斷異常和崩潰報(bào)告,并且能夠設(shè)置監(jiān)視點(diǎn)以監(jiān)控特定字段
在 Android 版本 5.0(API 級(jí)別 21)之前祠挫,Dalvik 是 Android Runtime那槽。如果您的應(yīng)用在 ART 上運(yùn)行效果很好,那么它應(yīng)該也可在 Dalvik 上運(yùn)行等舔,但反過來不一定骚灸。
Android 還包含一套核心運(yùn)行時(shí)庫,可提供 Java API 框架使用的 Java 編程語言大部分功能慌植,包括一些 Java 8 語言功能甚牲。
- 原生 C/C++ 庫:許多核心 Android 系統(tǒng)組件和服務(wù)(例如 ART 和 HAL)構(gòu)建自原生代碼,需要以 C 和 C++ 編寫的原生庫蝶柿。Android 平臺(tái)提供 Java 框架 API 以向應(yīng)用顯示其中部分原生庫的功能丈钙。例如,您可以通過 Android 框架的 Java OpenGL API 訪問 OpenGL ES交汤,以支持在應(yīng)用中繪制和操作 2D 和 3D 圖形雏赦。
如果開發(fā)的是需要 C 或 C++ 代碼的應(yīng)用,可以使用 Android NDK 直接從原生代碼訪問某些原生平臺(tái)庫。 - Java API 框架:您可通過以 Java 語言編寫的 API 使用 Android OS 的整個(gè)功能集星岗。這些 API 形成創(chuàng)建 Android 應(yīng)用所需的構(gòu)建塊填大,它們可簡化核心模塊化系統(tǒng)組件和服務(wù)的重復(fù)使用,包括以下組件和服務(wù):
- 豐富俏橘、可擴(kuò)展的視圖系統(tǒng)允华,可用以構(gòu)建應(yīng)用的 UI,包括列表寥掐、網(wǎng)格靴寂、文本框、按鈕甚至可嵌入的網(wǎng)絡(luò)瀏覽器
- 資源管理器曹仗,用于訪問非代碼資源榨汤,例如本地化的字符串蠕搜、圖形和布局文件
- 通知管理器怎茫,可讓所有應(yīng)用在狀態(tài)欄中顯示自定義提醒
- Activity 管理器,用于管理應(yīng)用的生命周期妓灌,提供常見的導(dǎo)航返回棧
- 內(nèi)容提供程序轨蛤,可讓應(yīng)用訪問其他應(yīng)用(例如“聯(lián)系人”應(yīng)用)中的數(shù)據(jù)或者共享其自己的數(shù)據(jù)
開發(fā)者可以完全訪問 Android 系統(tǒng)應(yīng)用使用的框架 API。
- 系統(tǒng)應(yīng)用:Android 隨附一套用于電子郵件虫埂、短信祥山、日歷、互聯(lián)網(wǎng)瀏覽和聯(lián)系人等的核心應(yīng)用掉伏。平臺(tái)隨附的應(yīng)用與用戶可以選擇安裝的應(yīng)用一樣缝呕,沒有特殊狀態(tài)。因此第三方應(yīng)用可成為用戶的默認(rèn)網(wǎng)絡(luò)瀏覽器斧散、短信 Messenger 甚至默認(rèn)鍵盤(有一些例外供常,例如系統(tǒng)的“設(shè)置”應(yīng)用)。
系統(tǒng)應(yīng)用可用作用戶的應(yīng)用鸡捐,以及提供開發(fā)者可從其自己的應(yīng)用訪問的主要功能栈暇。例如,如果您的應(yīng)用要發(fā)短信箍镜,您無需自己構(gòu)建該功能源祈,可以改為調(diào)用已安裝的短信應(yīng)用向您指定的接收者發(fā)送消息。
從上圖可以將Android平臺(tái)劃分為兩層色迂,一層是由C/C++編寫的香缺,可以稱為Native層。另一層是由Java編寫的歇僧,可以稱為Framework層赫悄。這兩層之間的聯(lián)系是通過JNI進(jìn)行連接。
Android源碼下載
了解了Android平臺(tái)架構(gòu)之后,作為開發(fā)者學(xué)習(xí)源碼埂淮,需要下載其源代碼姑隅。在下載源代碼之前,需要了解AOSP這個(gè)概念倔撞,AOSP是Android Open Source Project(Androi開源項(xiàng)目)的縮寫讲仰,如果可以翻墻的話,可以按照AOSP官網(wǎng) https://source.android.com/setup/downloading 這個(gè)地址上的步驟進(jìn)行源碼下載痪蝇,如果不具備翻墻的條件鄙陡,可以在清華大學(xué)開源軟件鏡像站 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 進(jìn)行下載。步驟如下:
安裝 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'
## 如果需要某個(gè)特定的Android版本给僵,則使用repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-7.1.0_r1
同步源碼樹(以后只需執(zhí)行這條命令來同步)
repo sync
如果中間有網(wǎng)絡(luò)斷開的情況毫捣,則只需要執(zhí)行repo sync繼續(xù)同步即可。直到下載完Android源碼帝际。
相關(guān)鏈接
Android官方文檔
AOSP官網(wǎng)
清華大學(xué)AOSP鏡像地址
中國科學(xué)技術(shù)大學(xué)開源軟件鏡像服務(wù)