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

想成為一位合格的Android程序員或者一位Android高級工程師是十分有必要知道Android的框架層的工作原理,要知道其工作原理那么就需要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的肯定是自己親手下載編譯。為什么要閱讀Android源代碼? 第一,面試加分項。第二,知其原理寫出的代碼差不到那里。第三,學(xué)習(xí)深度。正所謂,知其然知其所以然。下面記錄我基于7.1.1系統(tǒng)源碼下載到刷機的過程。

基本概念

  • AOSP : 就是Android Open Source Project也就是谷歌開放源代碼項目。 通過Google官方下載的源代碼也就是AOSP的代碼,是不包含Google開發(fā)的全家桶的應(yīng)用。
    ps: 這個作為一個Android程序員肯定要知道的一個專業(yè)詞,不然顯得你很Low,很不專業(yè)。
  • Repo : Repo 是一款工具,可讓您在 Android 環(huán)境中更輕松地使用 Git,換句話來說Repo是用來管理Git管理的每個倉庫。詳情定義請點擊here.

準(zhǔn)備

  • 編譯系統(tǒng):UbuntuKylin 16.04 LTS。
  • 手機:Nexus 6。
  • 驅(qū)動:Nexus 6驅(qū)動。
  • Android系統(tǒng):Android 7.1.1。

注:從Android官網(wǎng)上是否有支持該手機的系統(tǒng)源代碼和驅(qū)動程序。

搭建編譯環(huán)境

1.安裝 JDK

如果 Ubuntu >= 15.04,則可以運行以下命令進行安裝OpenJDK,這里使用的是OpenJDK. 之前準(zhǔn)備使用Ubuntu LTS 14.04版本編譯,但是安裝OpenJDK有點麻煩所以放棄使用Ubuntu LTS 14.04。

sudo apt-get update
sudo apt-get install openjdk-8-jdk

如果你不是編譯Android 7.1.1系統(tǒng)源碼,那么可以參考圖中的Android版本所對應(yīng)的JDK版本進行安裝。


Android系統(tǒng)版本對應(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é)開源軟件鏡像站的AOSP,可以參考這里的設(shè)置here

  • 安裝 Repo

1 . 確保主目錄下有一個 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è)置您的客戶端以訪問 Android 源代碼代碼庫:
1 . 創(chuàng)建一個空目錄來存放您的工作文件。

$ mkdir AndroidSource // AndroidSource這個是我自己命名存放源代碼的目錄名稱
$ cd AndroidSource
  1. 使用您的真實姓名和電子郵件地址配置 Git。如果你設(shè)置了Git的配置則跳過這一步。
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
  1. 運行 repo init進行初始化。以下-b進行檢出相對應(yīng)的分支,要查看分支列表,請參閱源代碼標(biāo)記和編譯版本
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57

初始化成功后,客戶端目錄中現(xiàn)在應(yīng)包含一個 .repo 目錄,清單等文件將保存在該目錄下。

下載 Android 源代碼樹

然后將 Android 源代碼樹從默認(rèn)清單中指定的代碼庫下載到工作目錄,運行以下命令:

$ repo sync

在下載的時候保證網(wǎng)絡(luò)的穩(wěn)定性,保證電腦設(shè)置了不休眠,可以晚上放著讓它下載。下載完大概30G左右。
下載源碼出現(xiàn)的問題不會太多,有問題的話大多數(shù)為網(wǎng)絡(luò)的問題,真正出問題最多的是源代碼的編譯,那簡直就是惡夢。

準(zhǔn)備編譯

下載專有二進制文件

我需要將編譯的源代碼刷到Nexus6,所以需要下載Nexus6的相對應(yīng)的驅(qū)動。
具體找到系統(tǒng)版本對應(yīng)手機型號相對應(yīng)的驅(qū)動二進制文件可以在這里找到here。

二進制驅(qū)動文件

然后將這三個壓縮包下載后,解壓縮得到三個sh文件。
將這三個sh文件copy到Android編譯目錄下。

$ ./extract-broadcom-shamu.sh
$ ./extract-moto-shamu.sh
$ ./extract-qcom-shamu.sh

運行以上命令后會顯示聲明信息,一直按回車,當(dāng)你看到以下信息就輸入:I ACCEPT就可以了。不要按得太快,很容易跳了輸入接受。。。。


圖片.png

Jack配置

Jack 是一種 Android 工具鏈,用于將 Java 源代碼編譯成 Android dex 字節(jié)碼。要使用 Jack,您只需使用標(biāo)準(zhǔn)的 Makefile 命令來編譯源代碼樹或您的項目即可,無需進行任何其他操作。Android 8.1 是使用 Jack 的最后一個版本。

2017 年 3 月 14 日公告發(fā)布之后,Jack 工具鏈已被棄用。Jack 是 Android 6.0–8.1 的默認(rèn) Android 編譯工具鏈。

如果你編譯AOSP的master分支,以及Android O及以后版本,Android提供了禁用的支持。具體可以參考 here。

在編譯7.1.1源碼的時候,我并沒有查怎么關(guān)閉Jack編譯。所以,需要檢查一下Jack-Server是否已經(jīng)安裝以及啟動。

  • 根據(jù)機器的RAM設(shè)置Jack-Server的VM大小,我機器是16G內(nèi)存,所以設(shè)置8G左右VM。
    修改prebuilts/sdk/tools/jack-admin 文件,找到變量JACK_SERVER_VM_ARGUMENTS位置在后面添加,添加參數(shù) -Xmx8000M

  • 進入prebuilts/sdk/tools 運行以下命令:

$ ./jack-admin start-server 
  • 如果提示沒有安裝的話,則運行以下命令,然后再次運行上面啟動jack-server的命令。
$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar 

保證Jack-Server服務(wù)啟動。不然在編譯的時候會遇到Jack-Server很多坑的。。。

設(shè)置環(huán)境

使用 envsetup.sh 腳本進行初始化環(huán)境。

$ source build/envsetup.sh

使用 lunch 選擇要編譯的目標(biāo)。

$ lunch

運行以上命令后,會列出當(dāng)前所有的Build Type,然后輸入23。這里我選擇23. aosp_shamu-userdebug,這個Build Type是可以調(diào)試,所以建議你選擇userdebug。具體可以參考這里的解析 here。

編譯代碼

make -j8 //-j8是并行的任務(wù)數(shù),根據(jù)機器CPU的內(nèi)核線程數(shù)來設(shè)置。

編譯過程遇到的問題

  • 編譯百分比之0就報出來的錯誤,m4沒有安裝。
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)部錯誤,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
  • 編譯百分之一的時候報的錯誤,bison 沒有安裝。
編譯錯誤1

解決方法:

1. sudo apt-get install bison
2. sudo apt-get install  g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
  • 其中編譯過程有Jack-Server也報的問題,有沒有安裝,沒有啟動的問題,那時候急著解決問題,所以沒有相對應(yīng)的截圖。所以我在上面也寫保證Jack-Server先安裝啟動,不然在后面的編譯7.1.1源碼會報錯。在編譯的過程中,我的機器暫時沒有報Jack-Server內(nèi)存不足的錯誤。如果你使用虛擬機進行編譯時,內(nèi)存至少要8G,不然會報內(nèi)存不足的編譯錯誤。
Jack-Server錯誤.png
圖片.png

編譯的時候遇到的坑遠(yuǎn)遠(yuǎn)不止以上的問題,有些沒有記錄下來。。。

編譯失敗后,我都是重新手動刪掉out目錄,以避免出現(xiàn)更多的問題,然后重新運行上面的>設(shè)置環(huán)境步驟。

  • 經(jīng)過幾天的努力與堅持,終于編譯成功了,激動~~


    編譯成功后的提示.png

使用 fastboot 刷機

首先,保證已經(jīng)unlock解鎖 可以正常刷機。具體怎么解鎖Google一下。刷機前,請備份好個人重要的資料,刷機會將所有資料都會清空。
然后,連上電腦。
接著,在源碼根目錄下(就是下載源代碼的目錄)執(zhí)行下面命令:

$ adb reboot bootloader //進入bootloader模式
$ fastboot -w flashall  //使用fastboot進行刷機
開始刷機.png
刷機已完成.png

End

在這里整一個過程就結(jié)束了,但是這只是閱讀源代碼的一個新開始!接然的還有如何將AOSP導(dǎo)入到Android Studio進行閱讀以及調(diào)試和如何閱讀。雖然這個過程辛苦,但是這是值得的,一起加油努力學(xué)習(xí)~~

更多編譯錯誤鏈接:https://ichrisking.github.io/2017/08/25/rom7.0-build/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容