想成為一位合格的Android程序員或者一位Android高級(jí)工程師是十分有必要知道Android的框架層的工作原理辛块,要知道其工作原理那么就需要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的肯定是自己親手下載編譯铅碍。為什么要閱讀Android源代碼润绵? 第一,面試加分項(xiàng)胞谈。第二授药,知其原理寫(xiě)出的代碼差不到那里士嚎。第三,學(xué)習(xí)深度悔叽。正所謂莱衩,知其然知其所以然。下面記錄我基于7.1.1系統(tǒng)源碼下載到刷機(jī)的過(guò)程娇澎。
基本概念
-
AOSP : 就是Android Open Source Project也就是谷歌開(kāi)放源代碼項(xiàng)目笨蚁。 通過(guò)Google官方下載的源代碼也就是AOSP的代碼,是不包含Google開(kāi)發(fā)的全家桶的應(yīng)用趟庄。
ps: 這個(gè)作為一個(gè)Android程序員肯定要知道的一個(gè)專業(yè)詞,不然顯得你很Low括细,很不專業(yè)。 - Repo : Repo 是一款工具戚啥,可讓您在 Android 環(huán)境中更輕松地使用 Git奋单,換句話來(lái)說(shuō)Repo是用來(lái)管理Git管理的每個(gè)倉(cāng)庫(kù)。詳情定義請(qǐng)點(diǎn)擊here.
準(zhǔn)備
- 編譯系統(tǒng):UbuntuKylin 16.04 LTS猫十。
- 手機(jī):Nexus 6览濒。
- 驅(qū)動(dòng):Nexus 6驅(qū)動(dòng)。
- Android系統(tǒng):Android 7.1.1拖云。
注:從Android官網(wǎng)上是否有支持該手機(jī)的系統(tǒng)源代碼和驅(qū)動(dòng)程序贷笛。
搭建編譯環(huán)境
1.安裝 JDK
如果 Ubuntu >= 15.04,則可以運(yùn)行以下命令進(jìn)行安裝OpenJDK,這里使用的是OpenJDK. 之前準(zhǔn)備使用Ubuntu LTS 14.04版本編譯宙项,但是安裝OpenJDK有點(diǎn)麻煩所以放棄使用Ubuntu LTS 14.04乏苦。
sudo apt-get update
sudo apt-get install openjdk-8-jdk
如果你不是編譯Android 7.1.1系統(tǒng)源碼,那么可以參考圖中的Android版本所對(duì)應(yīng)的JDK版本進(jìn)行安裝尤筐。
2.主要軟件包
- Python : Python 2.6 - 2.7.
- Git : Git 1.7 或更高版本.
下載源代碼
我這里下載的Google官方的AOSP, 下載官方的需要科學(xué)上網(wǎng)并且保證你的網(wǎng)絡(luò)穩(wěn)定汇荐。具體在清華大學(xué)開(kāi)源軟件鏡像站的AOSP,可以參考這里的設(shè)置here盆繁。
- 安裝 Repo
1 . 確保主目錄下有一個(gè) bin/ 目錄掀淘,并且該目錄包含在路徑中:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
2 . 下載 Repo 工具,并確保它可執(zhí)行:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
- 初始化 Repo 客戶端
安裝 Repo 后改基,設(shè)置您的客戶端以訪問(wèn) Android 源代碼代碼庫(kù):
1 . 創(chuàng)建一個(gè)空目錄來(lái)存放您的工作文件繁疤。
$ mkdir AndroidSource // AndroidSource這個(gè)是我自己命名存放源代碼的目錄名稱
$ cd AndroidSource
- 使用您的真實(shí)姓名和電子郵件地址配置 Git咖为。如果你設(shè)置了Git的配置則跳過(guò)這一步秕狰。
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
- 運(yùn)行 repo init進(jìn)行初始化。以下-b進(jìn)行檢出相對(duì)應(yīng)的分支躁染,要查看分支列表鸣哀,請(qǐng)參閱源代碼標(biāo)記和編譯版本。
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57
初始化成功后吞彤,客戶端目錄中現(xiàn)在應(yīng)包含一個(gè) .repo 目錄我衬,清單等文件將保存在該目錄下叹放。
下載 Android 源代碼樹(shù)
然后將 Android 源代碼樹(shù)從默認(rèn)清單中指定的代碼庫(kù)下載到工作目錄,運(yùn)行以下命令:
$ repo sync
在下載的時(shí)候保證網(wǎng)絡(luò)的穩(wěn)定性挠羔,保證電腦設(shè)置了不休眠井仰,可以晚上放著讓它下載。下載完大概30G左右破加。
下載源碼出現(xiàn)的問(wèn)題不會(huì)太多俱恶,有問(wèn)題的話大多數(shù)為網(wǎng)絡(luò)的問(wèn)題,真正出問(wèn)題最多的是源代碼的編譯范舀,那簡(jiǎn)直就是惡夢(mèng)合是。
準(zhǔn)備編譯
下載專有二進(jìn)制文件
我需要將編譯的源代碼刷到Nexus6,所以需要下載Nexus6的相對(duì)應(yīng)的驅(qū)動(dòng)锭环。
具體找到系統(tǒng)版本對(duì)應(yīng)手機(jī)型號(hào)相對(duì)應(yīng)的驅(qū)動(dòng)二進(jìn)制文件可以在這里找到here聪全。
然后將這三個(gè)壓縮包下載后,解壓縮得到三個(gè)sh文件辅辩。
將這三個(gè)sh文件copy到Android編譯目錄下难礼。
$ ./extract-broadcom-shamu.sh
$ ./extract-moto-shamu.sh
$ ./extract-qcom-shamu.sh
運(yùn)行以上命令后會(huì)顯示聲明信息,一直按回車(chē)汽久,當(dāng)你看到以下信息就輸入:I ACCEPT就可以了鹤竭。不要按得太快,很容易跳了輸入接受景醇。臀稚。。三痰。
Jack配置
Jack 是一種 Android 工具鏈吧寺,用于將 Java 源代碼編譯成 Android dex 字節(jié)碼。要使用 Jack散劫,您只需使用標(biāo)準(zhǔn)的 Makefile 命令來(lái)編譯源代碼樹(shù)或您的項(xiàng)目即可稚机,無(wú)需進(jìn)行任何其他操作。Android 8.1 是使用 Jack 的最后一個(gè)版本获搏。
在 2017 年 3 月 14 日公告發(fā)布之后赖条,Jack 工具鏈已被棄用。Jack 是 Android 6.0–8.1 的默認(rèn) Android 編譯工具鏈常熙。
如果你編譯AOSP的master分支纬乍,以及Android O及以后版本,Android提供了禁用的支持裸卫。具體可以參考 here仿贬。
在編譯7.1.1源碼的時(shí)候,我并沒(méi)有查怎么關(guān)閉Jack編譯墓贿。所以茧泪,需要檢查一下Jack-Server是否已經(jīng)安裝以及啟動(dòng)蜓氨。
根據(jù)機(jī)器的RAM設(shè)置Jack-Server的VM大小,我機(jī)器是16G內(nèi)存队伟,所以設(shè)置8G左右VM穴吹。
修改prebuilts/sdk/tools/jack-admin 文件,找到變量JACK_SERVER_VM_ARGUMENTS位置在后面添加嗜侮,添加參數(shù) -Xmx8000M進(jìn)入prebuilts/sdk/tools 運(yùn)行以下命令:
$ ./jack-admin start-server
- 如果提示沒(méi)有安裝的話刀荒,則運(yùn)行以下命令,然后再次運(yùn)行上面啟動(dòng)jack-server的命令。
$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
保證Jack-Server服務(wù)啟動(dòng)棘钞。不然在編譯的時(shí)候會(huì)遇到Jack-Server很多坑的缠借。。宜猜。
設(shè)置環(huán)境
使用 envsetup.sh 腳本進(jìn)行初始化環(huán)境泼返。
$ source build/envsetup.sh
使用 lunch 選擇要編譯的目標(biāo)。
$ lunch
運(yùn)行以上命令后姨拥,會(huì)列出當(dāng)前所有的Build Type绅喉,然后輸入23。這里我選擇23. aosp_shamu-userdebug叫乌,這個(gè)Build Type是可以調(diào)試柴罐,所以建議你選擇userdebug。具體可以參考這里的解析 here憨奸。
編譯代碼
make -j8 //-j8是并行的任務(wù)數(shù)革屠,根據(jù)機(jī)器CPU的內(nèi)核線程數(shù)來(lái)設(shè)置。
編譯過(guò)程遇到的問(wèn)題
- 編譯百分比之0就報(bào)出來(lái)的錯(cuò)誤排宰,m4沒(méi)有安裝似芝。
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -o/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"
flex-2.5.39:嚴(yán)重內(nèi)部錯(cuò)誤,exec of /usr/bin/m4 failed
[ 0% 8/49773] Yacc: aidl <= system/tools/aidl/aidl_language_y.yy
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/bison/bison -d --defines=/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o /home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy"
[ 0% 8/49773] host C++: ijar <= build/tools/ijar/classfile.cc
ninja: build stopped: subcommand failed.
build/core/ninja.mk:151: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1
解決方法:
sudo apt-get install m4
- 編譯百分之一的時(shí)候報(bào)的錯(cuò)誤板甘,bison 沒(méi)有安裝党瓮。
解決方法:
1. sudo apt-get install bison
2. sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
- 其中編譯過(guò)程有Jack-Server也報(bào)的問(wèn)題,有沒(méi)有安裝盐类,沒(méi)有啟動(dòng)的問(wèn)題寞奸,那時(shí)候急著解決問(wèn)題,所以沒(méi)有相對(duì)應(yīng)的截圖在跳。所以我在上面也寫(xiě)保證Jack-Server先安裝啟動(dòng)枪萄,不然在后面的編譯7.1.1源碼會(huì)報(bào)錯(cuò)。在編譯的過(guò)程中硬毕,我的機(jī)器暫時(shí)沒(méi)有報(bào)Jack-Server內(nèi)存不足的錯(cuò)誤呻引。如果你使用虛擬機(jī)進(jìn)行編譯時(shí)礼仗,內(nèi)存至少要8G吐咳,不然會(huì)報(bào)內(nèi)存不足的編譯錯(cuò)誤逻悠。
編譯的時(shí)候遇到的坑遠(yuǎn)遠(yuǎn)不止以上的問(wèn)題,有些沒(méi)有記錄下來(lái)韭脊。童谒。。
編譯失敗后沪羔,我都是重新手動(dòng)刪掉out目錄饥伊,以避免出現(xiàn)更多的問(wèn)題,然后重新運(yùn)行上面的>設(shè)置環(huán)境步驟蔫饰。
-
經(jīng)過(guò)幾天的努力與堅(jiān)持琅豆,終于編譯成功了,激動(dòng)~~
使用 fastboot 刷機(jī)
首先篓吁,保證已經(jīng)unlock解鎖 可以正常刷機(jī)茫因。具體怎么解鎖Google一下。刷機(jī)前杖剪,請(qǐng)備份好個(gè)人重要的資料冻押,刷機(jī)會(huì)將所有資料都會(huì)清空。
然后盛嘿,連上電腦洛巢。
接著,在源碼根目錄下(就是下載源代碼的目錄)執(zhí)行下面命令:
$ adb reboot bootloader //進(jìn)入bootloader模式
$ fastboot -w flashall //使用fastboot進(jìn)行刷機(jī)
End
在這里整一個(gè)過(guò)程就結(jié)束了次兆,但是這只是閱讀源代碼的一個(gè)新開(kāi)始稿茉!接然的還有如何將AOSP導(dǎo)入到Android Studio進(jìn)行閱讀以及調(diào)試和如何閱讀。雖然這個(gè)過(guò)程辛苦芥炭,但是這是值得的狈邑,一起加油努力學(xué)習(xí)~~
更多編譯錯(cuò)誤鏈接:https://ichrisking.github.io/2017/08/25/rom7.0-build/