1. 程式人生 > >AOSP (一):獲取原始碼

AOSP (一):獲取原始碼

準備知識

AOSP即Android Open Source Project,也就是Android系統原始碼的相關內容。這塊程式碼巨多,而且牽扯比較廣,需要各種各樣的相關知識。不過AOSP的內容模組相對清晰,仔細啃還是可以的。

AOSP的相關參考資料也是很多的,我現在一般是跟著老羅的Android系統原始碼情景分析的書和部落格搞事情,他的講解都有原始碼和例子,廢話比較少,比較易懂。同時他的內容比較多的涉及framework方面的東西,底層比如bionic,ART和dalvik虛擬機器的部分相對就講的少一點,所以我又搞了劉超的《深入解析Android5.0系統》這本書,兩邊現在都在慢慢啃。Anyway,資料這玩意只是輔助,提供思路,最後還是自己啃程式碼靠譜。

除了原始碼部分的內容,Android系統是基於Linux系統建立的,一定程度上講Android其實算是執行在Linux作業系統上的軟體,所以Linux的相關內容也是需要了解的。這部分資料就更多了,隨意就行。

獲取原始碼

編譯環境

Android原始碼目前只能在Linux上編譯使用,所以要看原始碼請移步Linux系統。我用的是Ubuntu,算是主流了吧。然後獲取和執行原始碼需要以下工具:

  • Git工具:其實也不一定,一些映象支援直接下載
  • Java SDK: 不然拿頭跑
  • 可能還需要一些工具包,可以用以下命令獲取:
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6
-dev build-essential zip curl valgrind

這些工具都是用來獲取和編譯原始碼的,具體作用如下:

工具 作用
flex and bison 用來解析各種各樣格式的檔案
gperf 用來生成高效的hash函式,並以C或C++程式碼形式給出
libsdl-dev SDL(Simple DirectMedia Layer)的開發庫
libesd0-dev ESD(Enlightened Sound Daemon)開發庫
libwxgt-dev wxWidgets(主要用來開發誇平臺C應用的C++庫)開發庫
build-essential 各項build工具(gcc,g++等)的meta package
zip 壓縮工具不用多說了吧
curl 利用URL語法進行檔案傳輸的工具
valgrind 用於記憶體除錯,記憶體洩漏檢測和效能分析的工具

這些工具不是必須的,有些可能也已經有了,可以按需。

下載原始碼

這部分不復雜,但是容易崩,因為aosp很大,sync一個20來G的玩意,如果從官方往下搞因為大家都知道的原因會很慢而且容易崩,甚至卡進度。所以推薦國內映象,比如清華的映象就很好,上邊有詳細的下載教程。

編譯執行AOSP

編譯AOSP

拿到原始碼之後,到根目錄下,就可以開始編譯。AOSP有一套自己的build系統,用來應對原始碼大量的編譯整合工作,基本上原則就是分模組編譯然後整合,並實現增量編譯,並且可以根據設定編譯不同版本和平臺的Android系統原始碼。這部分就可以看好久了。。。尤其是我這種菜雞。

最簡單的編譯命令是這樣的:

. build/envsetup.sh
lunch
make

基本上就是envsetup.sh構建環境,定義一些shell命令,然後lunch選擇想要編譯的版本,最後make進行編譯。第一次編譯時間很長而且會有各種坑,比如我遇到了jdk版本問題,AOSP要求必須是OpenJDK。然後就是漫長的等待,推薦跪著編譯,效果拔群。

執行AOSP

玩遊戲,就是要贏編譯程式碼,就是為了執行,所以編譯好以後就可以常識執行。預設情況下,模擬器自身在out/host/linux-x86/bin裡邊,然後需要載入四個檔案,分別是一個Linux核心映象檔案zImage,預設為out/host/linux-x86/bin/kernel-qemu;三個Android系統映象檔案system.img, userdata.img,以及ramdisk.img,這仨貨是編譯生成的,在`out/target/product/generic資料夾底下。執行的時候為了方便,可以把這些路徑扔到系統變數裡去。於是用以下命令執行:

export PATH = $PATH:/<path-to-aosp>/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT = /<path-to-aosp>/out/target/product/generic
emulator

這裡,ANDROID_PRODUCT_OUT是預設的emulator找Andorid系統映象的地址,需要手動設定一下。另外,AOSP預設的Linux核心是沒有原始碼的,需要看這部分的話需要單獨下載。

Anroid核心原始碼

這部分其實跟AOSP關係不大,但是可能需要針對不同機型的話就需要相對應修改這一部分。首先這部分要用git來把程式碼搞下來:

git clone https://android.googlesrouce.com/kernel/goldfish.git

其中,goldfish是模擬器用的核心版本,可以根據不同的版本需求用不同的庫,其餘型別還有common,exynos等。

拿到原始碼之後,checkout一個分支出來就可以吃了。具體checkout哪一個,需要看你的Android原始碼支援適配哪個版本,也就是之前執行用的那個image是哪個版本的。比如goldfish,可以到device/generic/goldfish資料夾下邊用git log檢視最新的commit,然後根據commit來checkout相應的branch和commit就可以了。

再來就是編譯核心,新版本的核心不需要太多配置,可以使用make help檢視有哪些合適的目標,然後使用make <target>設定配置檔案,最後再使用make進行編譯就可以了,最後會提示相應的檔案所在的位置,把檔案扔到上邊執行虛擬機器的配置裡替換原來的核心就可以了。核心原始碼這部分還比較糊,後邊要用的話再說。