Android 7.1.1系統源碼下載、編譯、刷機-Nexus 6實戰

想成爲一位合格的Android程序員或者一位Android高級工程師是十分有必要知道Android的框架層的工做原理,要知道其工做原理那麼就須要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的確定是本身親手下載編譯。爲何要閱讀Android源代碼? 第一,面試加分項。第二,知其原理寫出的代碼差不到那裏。第三,學習深度。正所謂,知其然知其因此然。下面記錄我基於7.1.1系統源碼下載到刷機的過程。javascript

基本概念

  • AOSP : 就是Android Open Source Project也就是谷歌開放源代碼項目。 經過Google官方下載的源代碼也就是AOSP的代碼,是不包含Google開發的全家桶的應用。 ps: 這個做爲一個Android程序員確定要知道的一個專業詞,否則顯得你很Low,很不專業。
  • Repo : Repo 是一款工具,可以讓您在 Android 環境中更輕鬆地使用 Git,換句話來講Repo是用來管理Git管理的每一個倉庫。詳情定義請點擊here.

準備

  • 編譯系統:UbuntuKylin 16.04 LTS。
  • 手機:Nexus 6。
  • 驅動:Nexus 6驅動。
  • Android系統:Android 7.1.1。

注:從Android官網上是否有支持該手機的系統源代碼和驅動程序。html

搭建編譯環境

1.安裝 JDK

若是 Ubuntu >= 15.04,則能夠運行如下命令進行安裝OpenJDK,這裏使用的是OpenJDK. 以前準備使用Ubuntu LTS 14.04版本編譯,可是安裝OpenJDK有點麻煩因此放棄使用Ubuntu LTS 14.04。java

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

若是你不是編譯Android 7.1.1系統源碼,那麼能夠參考圖中的Android版本所對應的JDK版本進行安裝。 Android系統版本對應的JDKlinux

2.主要軟件包

  • Python : Python 2.6 - 2.7.
  • Git : Git 1.7 或更高版本.

下載源代碼

我這裏下載的Google官方的AOSP, 下載官方的須要***而且保證你的網絡穩定。具體在清華大學開源軟件鏡像站的AOSP,能夠參考這裏的設置hereandroid

  • 安裝 Repo

1 . 確保主目錄下有一個 bin/ 目錄,而且該目錄包含在路徑中:nginx

$ mkdir ~/bin $ PATH=~/bin:$PATH 

2 . 下載 Repo 工具,並確保它可執行:git

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo 
  • 初始化 Repo 客戶端

安裝 Repo 後,設置您的客戶端以訪問 Android 源代碼代碼庫: 1 . 建立一個空目錄來存放您的工做文件。程序員

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

初始化成功後,客戶端目錄中如今應包含一個 .repo 目錄,清單等文件將保存在該目錄下。github

下載 Android 源代碼樹

而後將 Android 源代碼樹從默認清單中指定的代碼庫下載到工做目錄,運行如下命令:面試

$ repo sync 

在下載的時候保證網絡的穩定性,保證電腦設置了不休眠,能夠晚上放着讓它下載。下載完大概30G左右。 下載源碼出現的問題不會太多,有問題的話大多數爲網絡的問題,真正出問題最多的是源代碼的編譯,那簡直就是惡夢。

準備編譯

下載專有二進制文件

我須要將編譯的源代碼刷到Nexus6,因此須要下載Nexus6的相對應的驅動。 具體找到系統版本對應手機型號相對應的驅動二進制文件能夠在這裏找到here。 二進制驅動文件

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

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

運行以上命令後會顯示聲明信息,一直按回車,當你看到如下信息就輸入:I ACCEPT就能夠了。不要按得太快,很容易跳了輸入接受。。。。 圖片.png

Jack配置

Jack 是一種 Android 工具鏈,用於將 Java 源代碼編譯成 Android dex 字節碼。要使用 Jack,您只需使用標準的 Makefile 命令來編譯源代碼樹或您的項目便可,無需進行任何其餘操做。Android 8.1 是使用 Jack 的最後一個版本。

在 2017 年 3 月 14 日公告發佈以後,Jack 工具鏈已被棄用。Jack 是 Android 6.0–8.1 的默認 Android 編譯工具鏈。

若是你編譯AOSP的master分支,以及Android O及之後版本,Android提供了禁用的支持。具體能夠參考 here

在編譯7.1.1源碼的時候,我並無查怎麼關閉Jack編譯。因此,須要檢查一下Jack-Server是否已經安裝以及啓動。

  • 根據機器的RAM設置Jack-Server的VM大小,我機器是16G內存,因此設置8G左右VM。 修改prebuilts/sdk/tools/jack-admin 文件,找到變量JACK_SERVER_VM_ARGUMENTS位置在後面添加,添加參數 -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服務啓動。否則在編譯的時候會遇到Jack-Server不少坑的。。。

設置環境

使用 envsetup.sh 腳本進行初始化環境。

$ source build/envsetup.sh 

使用 lunch 選擇要編譯的目標。

$ lunch 

運行以上命令後,會列出當前全部的Build Type,而後輸入23。這裏我選擇23. aosp_shamu-userdebug,這個Build Type是能夠調試,因此建議你選擇userdebug。具體能夠參考這裏的解析 here

編譯代碼

make -j8 //-j8是並行的任務數,根據機器CPU的內核線程數來設置。 

編譯過程遇到的問題

  • 編譯百分比之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:嚴重內部錯誤,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也報的問題,有沒有安裝,沒有啓動的問題,那時候急着解決問題,因此沒有相對應的截圖。因此我在上面也寫保證Jack-Server先安裝啓動,否則在後面的編譯7.1.1源碼會報錯。在編譯的過程當中,個人機器暫時沒有報Jack-Server內存不足的錯誤。若是你使用虛擬機進行編譯時,內存至少要8G,否則會報內存不足的編譯錯誤。

Jack-Server錯誤.png

圖片.png

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

編譯失敗後,我都是從新手動刪掉out目錄,以免出現更多的問題,而後從新運行上面的>設置環境步驟。

  • 通過幾天的努力與堅持,終於編譯成功了,激動~~ 編譯成功後的提示.png

使用 fastboot 刷機

首先,保證已經unlock解鎖 能夠正常刷機。具體怎麼解鎖Google一下。刷機前,請備份好我的重要的資料,刷機會將全部資料都會清空。 而後,連上電腦。 接着,在源碼根目錄下(就是下載源代碼的目錄)執行下面命令:

$ adb reboot bootloader //進入bootloader模式 $ fastboot -w flashall //使用fastboot進行刷機 

開始刷機.png

刷機已完成.png

End

在這裏整一個過程就結束了,可是這只是閱讀源代碼的一個新開始!接然的還有如何將AOSP導入到Android Studio進行閱讀以及調試和如何閱讀。雖然這個過程辛苦,可是這是值得的,一塊兒加油努力學習~~

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

相關文章
相關標籤/搜索