Android 7.1.1系統(tǒng)源碼下載、編譯反症、刷機(jī)-Nexus 6實(shí)戰(zhàn)

想成為一位合格的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)行安裝尤筐。


Android系統(tǒng)版本對(duì)應(yīng)的JDK

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
  1. 使用您的真實(shí)姓名和電子郵件地址配置 Git咖为。如果你設(shè)置了Git的配置則跳過(guò)這一步秕狰。
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
  1. 運(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聪全。

二進(jìn)制驅(qū)動(dòng)文件

然后將這三個(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就可以了鹤竭。不要按得太快,很容易跳了輸入接受景醇。臀稚。。三痰。


圖片.png

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)有安裝党瓮。
編譯錯(cuò)誤1

解決方法:

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ò)誤逻悠。
Jack-Server錯(cuò)誤.png
圖片.png

編譯的時(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)~~


    編譯成功后的提示.png

使用 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ī)
開(kāi)始刷機(jī).png
刷機(jī)已完成.png

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚤认,隨后出現(xiàn)的幾起案子米苹,更是在濱河造成了極大的恐慌,老刑警劉巖砰琢,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蘸嘶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陪汽,警方通過(guò)查閱死者的電腦和手機(jī)训唱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挚冤,“玉大人况增,你說(shuō)我怎么就攤上這事⊙档玻” “怎么了澳骤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵歧强,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我为肮,道長(zhǎng)摊册,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任颊艳,我火速辦了婚禮茅特,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棋枕。我一直安慰自己白修,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布重斑。 她就那樣靜靜地躺著熬荆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绸狐。 梳的紋絲不亂的頭發(fā)上卤恳,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音寒矿,去河邊找鬼突琳。 笑死晓折,一個(gè)胖子當(dāng)著我的面吹牛火焰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唁情,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啊终,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镜豹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蓝牲,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趟脂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后例衍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昔期,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年佛玄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硼一。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梦抢,死狀恐怖般贼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤哼蛆,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布蕊梧,位于F島的核電站,受9級(jí)特大地震影響人芽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绩脆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一萤厅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靴迫,春花似錦惕味、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至主守,卻和暖如春禀倔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背参淫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工救湖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涎才。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓鞋既,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耍铜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邑闺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容