環境: 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 ;
? ? ? ? 執行:$ sudo update-alternatives –config java,選擇java的版本
? ? ? ? 執行:$ sudo update-alternatives –config javac,選擇javac的版本
? ? ? ? 設置JDK優先級
? ? ? ? $ sudo update-alternatives --config java
? ? ? ? $ sudo update-alternatives --config javac
??????? 選擇完后命令輸入 java -version 檢查
????? ? 我并沒有配置Java_Home,是因為同事告訴我不配置的話在編譯的時候會自動選擇jdk版本,相對方便些。
### ? 安裝git : 使用repo工具會用到git
? ? ? ? $ sudo apt-get install git;
? ? ? ? 安裝完后進行配置:
? ? ? ? $ git config --global user.email "your email Address"
? ? ? ? $ git config --global user.name "your name"
### ? 安裝curl:官方說法就是一個開源的文件傳輸工具,類似windows 的迅雷
? ? ? ? $ sudo apt-get install curl -y
No 2 . ?下載Android源碼
? ?打開終端,執行如下命令:
? ?### 新建一個bin目錄
? ? ? ? $ mkdir ~/bin
? ?### 將bin目錄添加到環境變量中,這樣做可以在任何目錄都可以訪問
? ? ? ? $ PATH=~/bin:$PATH
? ?### 使用 curl 下載 repo 到bin目錄下
? ? ? ? $ curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo > ~/bin/repo
? ?### 修改repo文件:國內訪問不了Google,需要使用清華鏡像下載
? ? ? ? $ sudo gedit ~/bin/repo ;
? ? ? ? 設置REPO_URL 為:'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'
? ?### 添加權限
? ? ? ? $ chmod a+x ~/bin/repo
? ?### 新建目錄,用來存放下載的源碼,另外:安裝Ubuntu的時候務必給 /home最少100G ? ? ? ? ? ? ? ? ? 空間,否則后面比較麻煩。需要用到 Gparted 分區工具再分配空間
? ? ? ? $ mkdir source? ,然后切換到source目錄:$ cd source
? ?### 初始化倉庫
? ? ? ? $ repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android- 7.1.1_r24
? ? ? ? 如果提示需要驗證信息,使用命令:
? ? ? ? $ git config --global user.email "your email address"
? ? ? ? $ git config --global user.name "your name"
? ? ? ? 后面 -b 參數 是取的源碼中的一個分支,較穩定的版本,而不加 -b 則會下載Android主線上正在開發中的最新代碼。
? ? ? ??Android版本與代號對應關系?參考這個網址查看手機的版本代號,部分截圖如下
? ?### 開始漫長的下載.....
? ? ? ? $ repo sync? 下載過程中,務必保證網絡通暢,如中途中斷,重新執行repo sync即可。以后需要更新代碼的話,同樣運行這個命令即可
### 替換已有的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 提示錯誤,將git:替換成https://
No 3 . ?編譯Android源碼
? ?### 搭建編譯環境之 安裝JDK
? ? ? ? ?在android 5.0之前,編譯使用的是Oracle JDK,之后google將其替換成OpenJDK。上面有安裝方法,此處不再贅述。。。
? ?### 搭建編譯環境之 安裝ccache
? ? ? ???作用:加快編譯速度
? ? ? ? $ sudo apt-get install ccache
? ? ? ? $ source ~/.bashrc
? ? ? ? $ echo export USE_CCACHE=1>> ~/.bashrc ?按Esc 然后輸入:qw回車退出
? ? ? ? $ prebuilts/misc/linux-x86/ccache/ccache-M50G 設置編譯高速緩存
? ?### 搭建編譯環境之 安裝需要的包
? ? ? ? 參考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
? ? ? ? 如遇到依賴項錯誤, $ sudo apt-get install -f ,然后再執行上一步的操作
### 搭建編譯環境之 下載硬件驅動
? ? ? ? google雖然代碼開源,但是驅動并不開源,我們下載的源碼中是沒有vendor這個文件夾的,真機環境需要驅動
? ? ? ? 官方下載驅動地址:developers.google.com/android/nexus/drivers
? ? ? ? 這里就需要根據下載的源碼版本號去找相應的驅動了,在網址右側目錄尋找相應的型號以及版本號,如圖:
? ? ? ? 驅動下載完畢后,解壓出來其實就是幾個腳本文件,將腳本cp到源碼根目錄下 sh xxxxx.sh 執行,執行完畢后會生成vendor文件夾。 PS:執行腳本會提示按Enter繼續,這里別連續按,因為在最后會讓你輸入“I ACCEPT”,同意使用協議的,大概能看到第八條的時候速度慢點就能看到了。
? ?### 開始編譯
? ? ? ? 導入環境變量: source build/envsetup.sh
? ? ? ? lunch選擇編譯目標:輸入數字
? ? ? ? 開始編譯: make -j8 (-j后面數字根據電腦CPU個數決定,公司電腦配置比較好,我設置的18,下班前編譯,早上來就好了)
? ? ? ? 查看CPU個數:cat/proc/cpuinfo
No 4 . ?燒錄到nexus 5x?
? ?### 安裝adb
? ? ? ? $ sudo apt-get install adb
? ?### 進入fastboot模式
??????? 設置->關于手機->版本號->點擊五次進入開發者模式->打開USB調試,然后命令行輸入:adb devices,連接成功會提示如下:
??????? List of devices attached
??????? 021cbd7a4a92c20f????? device
? ? ? ? $ adb reboot bootloader
? ? ? ? 如果提示沒有fastboot? -> $ sudo apt-get install fastboot
?? ### 配置USB設備(驅動)
??????? 手機連接電腦,命令行輸入lsusb:如下
??????? 斷開連接,繼續輸入lsusb:如下
??????? 可以看到斷開連接后少了一個usb設備,即 Bus 001 Device 025: ID 18d1:4ee7 Google Inc.
??????? 編輯rules文件,將此設備添加到規則中 --> ~$ sudo gedit /etc/udev/rules.d/70-android.rules 如果沒有這個文件,新建一個
??????? 添加:SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee7", MODE="0666", OWNER=""
??????? 將你手機對應的ID后面的信息替換進去然后保存,然后更新下
??????? ~$ 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
### 燒錄過程遇到的問題:
? ? ? 錯誤1:data too large
? ? ? 原因:我們指定的鏡像位置的size超過了fastboot定義的最大值,不過我查資料說最新的fastboot已經替我們解決了這個題,可是我是用命令安裝的fastboot,具體原因我也不是很清楚。
????? 解決辦法 :cd 進入 ~/source/out/host/linux-x86/bin$,在這個目錄下有一個fastboot,我們就在當前目錄下執行 fastboot flashall-w
錯誤2:手機進入adb reboot bootloader 模式后 輸入fastboot flashall -w 顯示waiting for devices
?????? ? ? ? ? 但是開機狀態下 fastboot就可以正常連接
解決辦法:手機重啟進入bootloader模式后,連接電腦輸入lsusb 然后將ID信息再添加到rules文件中
?????????????? ~$ sudo gedit /etc/udev/rules.d/70-android.rules? . 然后按照上面的方法再更新下,然后再次fastboot flashall -w 等待刷機成功。
?? 總之,遇到問題多百度google,最好還是將官方文檔看一遍。這篇文章給需要的人做個參考,也是記錄下自己的學習過程!
?? 大家編譯燒錄成功后請記得給我留言,加油!!!