環(huán)境: Ubuntu16.04 LTS ? ?Nexus 5x ?openjdk 8
No 1 .? 安裝必要的工具
?### ? 安裝配置 openjdk :
? ? ? ? 添加源 :$ sudo add-apt-repository ppa:openjdk-r/ppa?
? ? ? ? 更新:$ sudo apt-get update
? ? ? ? 安裝 openjdk: $ sudo apt-get install openjdk-8-jdk ;
? ? ? ? 為了方便以后編譯其他版本的代碼,這里我安裝了6-8的openjdk
? ? ? ? $ sudo apt-get install openjdk-6-jdk ;
? ? ? ? $ sudo apt-get install openjdk-7-jdk ;
? ? ? ? 執(zhí)行:$ sudo update-alternatives –config java,選擇java的版本
? ? ? ? 執(zhí)行:$ sudo update-alternatives –config javac,選擇javac的版本
? ? ? ? 設(shè)置JDK優(yōu)先級(jí)
? ? ? ? $ sudo update-alternatives --config java
? ? ? ? $ sudo update-alternatives --config javac
??????? 選擇完后命令輸入 java -version 檢查
????? ? 我并沒有配置Java_Home,是因?yàn)橥赂嬖V我不配置的話在編譯的時(shí)候會(huì)自動(dòng)選擇jdk版本,相對(duì)方便些。
### ? 安裝git : 使用repo工具會(huì)用到git
? ? ? ? $ sudo apt-get install git;
? ? ? ? 安裝完后進(jìn)行配置:
? ? ? ? $ git config --global user.email "your email Address"
? ? ? ? $ git config --global user.name "your name"
### ? 安裝curl:官方說法就是一個(gè)開源的文件傳輸工具,類似windows 的迅雷
? ? ? ? $ sudo apt-get install curl -y
No 2 . ?下載Android源碼
? ?打開終端,執(zhí)行如下命令:
? ?### 新建一個(gè)bin目錄
? ? ? ? $ mkdir ~/bin
? ?### 將bin目錄添加到環(huán)境變量中,這樣做可以在任何目錄都可以訪問
? ? ? ? $ PATH=~/bin:$PATH
? ?### 使用 curl 下載 repo 到bin目錄下
? ? ? ? $ curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo > ~/bin/repo
? ?### 修改repo文件:國(guó)內(nèi)訪問不了Google,需要使用清華鏡像下載
? ? ? ? $ sudo gedit ~/bin/repo ;
? ? ? ? 設(shè)置REPO_URL 為:'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'
? ?### 添加權(quán)限
? ? ? ? $ chmod a+x ~/bin/repo
? ?### 新建目錄,用來存放下載的源碼,另外:安裝Ubuntu的時(shí)候務(wù)必給 /home最少100G ? ? ? ? ? ? ? ? ? 空間,否則后面比較麻煩。需要用到 Gparted 分區(qū)工具再分配空間
? ? ? ? $ mkdir source? ,然后切換到source目錄:$ cd source
? ?### 初始化倉(cāng)庫(kù)
? ? ? ? $ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android- 7.1.1_r24
? ? ? ? 如果提示需要驗(yàn)證信息,使用命令:
? ? ? ? $ git config --global user.email "your email address"
? ? ? ? $ git config --global user.name "your name"
? ? ? ? 后面 -b 參數(shù) 是取的源碼中的一個(gè)分支,較穩(wěn)定的版本,而不加 -b 則會(huì)下載Android主線上正在開發(fā)中的最新代碼。
? ? ? ??Android版本與代號(hào)對(duì)應(yīng)關(guān)系?參考這個(gè)網(wǎng)址查看手機(jī)的版本代號(hào),部分截圖如下

? ?### 開始漫長(zhǎng)的下載.....
? ? ? ? $ repo sync? 下載過程中,務(wù)必保證網(wǎng)絡(luò)通暢,如中途中斷,重新執(zhí)行repo sync即可。以后需要更新代碼的話,同樣運(yùn)行這個(gè)命令即可
### 替換已有的AOSP源代碼的remote
? ? ? ? 如果之前通過其他路徑獲取過源碼,但之后希望通過TUNA同步,只需要將 .repo/manifest.xml中的
? ? ? ? <remote name="aosp" fetch=".." review="https://android-review.googlesource.com/" ?/>
? ? ? ? 改為下面的即可:
? ? ? ? <remote name="aosp" fetch="git://aosp.tuna.tsinghua.edu.cn/android/" ?
? ? ? ? ????? review="https://android-review.googlesource.com/" />
?????? 如果git 提示錯(cuò)誤,將git:替換成https://
No 3 . ?編譯Android源碼
? ?### 搭建編譯環(huán)境之 安裝JDK
? ? ? ? ?在android 5.0之前,編譯使用的是Oracle JDK,之后google將其替換成OpenJDK。上面有安裝方法,此處不再贅述。。。
? ?### 搭建編譯環(huán)境之 安裝ccache
? ? ? ???作用:加快編譯速度
? ? ? ? $ sudo apt-get install ccache
? ? ? ? $ source ~/.bashrc
? ? ? ? $ echo export USE_CCACHE=1>> ~/.bashrc ?按Esc 然后輸入:qw回車退出
? ? ? ? $ prebuilts/misc/linux-x86/ccache/ccache-M50G 設(shè)置編譯高速緩存
? ?### 搭建編譯環(huán)境之 安裝需要的包
? ? ? ? 參考Google官方文檔:source.android.com/source/initializing.html
? ? ? ? 參考博客:安裝依賴
? ? ? ? $ sudo apt-get install g++-multilib
? ? ? ? $ sudo apt-get install python-markdown
? ? ? ? $ sudo apt-get install gperf
? ? ? ? $ sudo apt-get install libxml2-utils
? ? ? ? $ sudo apt-get install zlib1g-dev:i386
? ? ? ? $ sudo apt-get install zip
? ? ? ? $ sudo apt-get install gnupg
? ? ? ? $ sudo apt-get install libncurses5-dev:i386
? ? ? ? $ sudo apt-get install gcc-multilib
? ? ? ? 如遇到依賴項(xiàng)錯(cuò)誤, $ sudo apt-get install -f ,然后再執(zhí)行上一步的操作
### 搭建編譯環(huán)境之 下載硬件驅(qū)動(dòng)
? ? ? ? google雖然代碼開源,但是驅(qū)動(dòng)并不開源,我們下載的源碼中是沒有vendor這個(gè)文件夾的,真機(jī)環(huán)境需要驅(qū)動(dòng)
? ? ? ? 官方下載驅(qū)動(dòng)地址:developers.google.com/android/nexus/drivers
? ? ? ? 這里就需要根據(jù)下載的源碼版本號(hào)去找相應(yīng)的驅(qū)動(dòng)了,在網(wǎng)址右側(cè)目錄尋找相應(yīng)的型號(hào)以及版本號(hào),如圖:


? ? ? ? 驅(qū)動(dòng)下載完畢后,解壓出來其實(shí)就是幾個(gè)腳本文件,將腳本cp到源碼根目錄下 sh xxxxx.sh 執(zhí)行,執(zhí)行完畢后會(huì)生成vendor文件夾。 PS:執(zhí)行腳本會(huì)提示按Enter繼續(xù),這里別連續(xù)按,因?yàn)樵谧詈髸?huì)讓你輸入“I ACCEPT”,同意使用協(xié)議的,大概能看到第八條的時(shí)候速度慢點(diǎn)就能看到了。
? ?### 開始編譯
? ? ? ? 導(dǎo)入環(huán)境變量: source build/envsetup.sh
? ? ? ? lunch選擇編譯目標(biāo):輸入數(shù)字
? ? ? ? 開始編譯: make -j8 (-j后面數(shù)字根據(jù)電腦CPU個(gè)數(shù)決定,公司電腦配置比較好,我設(shè)置的18,下班前編譯,早上來就好了)
? ? ? ? 查看CPU個(gè)數(shù):cat/proc/cpuinfo
No 4 . ?燒錄到nexus 5x?
? ?### 安裝adb
? ? ? ? $ sudo apt-get install adb
? ?### 進(jìn)入fastboot模式
??????? 設(shè)置->關(guān)于手機(jī)->版本號(hào)->點(diǎn)擊五次進(jìn)入開發(fā)者模式->打開USB調(diào)試,然后命令行輸入:adb devices,連接成功會(huì)提示如下:
??????? List of devices attached
??????? 021cbd7a4a92c20f????? device
? ? ? ? $ adb reboot bootloader
? ? ? ? 如果提示沒有fastboot? -> $ sudo apt-get install fastboot
?? ### 配置USB設(shè)備(驅(qū)動(dòng))
??????? 手機(jī)連接電腦,命令行輸入lsusb:如下

??????? 斷開連接,繼續(xù)輸入lsusb:如下

??????? 可以看到斷開連接后少了一個(gè)usb設(shè)備,即 Bus 001 Device 025: ID 18d1:4ee7 Google Inc.
??????? 編輯rules文件,將此設(shè)備添加到規(guī)則中 --> ~$ sudo gedit /etc/udev/rules.d/70-android.rules 如果沒有這個(gè)文件,新建一個(gè)
??????? 添加:SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee7", MODE="0666", OWNER=""
??????? 將你手機(jī)對(duì)應(yīng)的ID后面的信息替換進(jìn)去然后保存,然后更新下
??????? ~$ cd /etc/udev/rules.d
??????? ~$ sudo chmod a+x 70-persistent-net.rules
??????? ~$ sudo udevadm control --reload-rules
? ?### 指定img鏡像位置
? ? ? ? export ANDROID_PRODUCT_OUT=out/target/product/bullhead
? ?### 燒錄
? ? ? ? fastboot flashall -w
### 燒錄過程遇到的問題:
? ? ? 錯(cuò)誤1:data too large
? ? ? 原因:我們指定的鏡像位置的size超過了fastboot定義的最大值,不過我查資料說最新的fastboot已經(jīng)替我們解決了這個(gè)題,可是我是用命令安裝的fastboot,具體原因我也不是很清楚。
????? 解決辦法 :cd 進(jìn)入 ~/source/out/host/linux-x86/bin$,在這個(gè)目錄下有一個(gè)fastboot,我們就在當(dāng)前目錄下執(zhí)行 fastboot flashall-w
錯(cuò)誤2:手機(jī)進(jìn)入adb reboot bootloader 模式后 輸入fastboot flashall -w 顯示waiting for devices
?????? ? ? ? ? 但是開機(jī)狀態(tài)下 fastboot就可以正常連接
解決辦法:手機(jī)重啟進(jìn)入bootloader模式后,連接電腦輸入lsusb 然后將ID信息再添加到rules文件中
?????????????? ~$ sudo gedit /etc/udev/rules.d/70-android.rules? . 然后按照上面的方法再更新下,然后再次fastboot flashall -w 等待刷機(jī)成功。
?? 總之,遇到問題多百度google,最好還是將官方文檔看一遍。這篇文章給需要的人做個(gè)參考,也是記錄下自己的學(xué)習(xí)過程!
?? 大家編譯燒錄成功后請(qǐng)記得給我留言,加油!??!