#編譯環境
軟體平臺 -Win10 Home 64bit -Vmware workstation 15 -Ubuntu 14.04.6LTS -OpenJDK1.8.0_45 -Android-8.1.0_r52
硬體平臺 -i7 8750H 16G 512G -Nexus 5x
#環境搭建
1.在Vmware中安裝Ubuntu,過程省略
注意:虛擬機器建議分配200G以上的空間,Android-8.1.0_r52編譯完大約佔用152G,加上系統佔用共156G,但是你硬碟最低要有250G的可用空間,因為Vmware還會佔用一部分,筆者編譯完後整個虛擬機器資料夾214G左右。同時虛擬機器記憶體建議分配8G以上,CPU根據自己宿主機的CPU情況來分。
2.安裝OpenJDK
我們編譯的Android版本為8.1,所以這裡採用OpenJDK8,各Android版本對應的JDK如下:
- Android 7.0 (Nougat) - Android 8.0 (Oreo):Ubuntu - OpenJDK 8;Mac OS - jdk 8u45 或更高版本
- Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
- Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
- Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5
(1)下載.deb 軟體包:
- openjdk-8-jre-headless_8u45-b14-1_amd64.deb
(SHA256:
0f5aba8db39088283b51e00054813063173a4d8809f70033976f83e214ab56c0
) - openjdk-8-jre_8u45-b14-1_amd64.deb
(SHA256:
9ef76c4562d39432b69baf6c18f199707c5c56a5b4566847df908b7d74e15849
) - openjdk-8-jdk_8u45-b14-1_amd64.deb
(SHA256:
6e47215cf6205aa829e6a0a64985075bd29d1f428a4006a80c9db371c2fc3c4c
)
(2)(可選)對照隨以上每個軟體包列出的 SHA256 字串,確認已下載檔案的校驗和。例如,使用 sha256sum 工具:
sha256sum {下載的.deb檔案}
複製程式碼
(3) 依次安裝下載的三個軟體包:
sudo dpkg -i {下載的.deb檔案}
複製程式碼
安裝過成中可能會提示缺少依賴,可以使用如下命令自動安裝依賴:
sudo apt-get -f install
複製程式碼
3.安裝編譯所需的軟體包
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
複製程式碼
4.配置Git
git config --global user.name "你的名字"
git config --global user.email "你的郵箱"
複製程式碼
5.下載 repo 工具
由於國內的特殊情況,這裡採用清華的映象源
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
複製程式碼
repo的執行過程中會嘗試訪問官方的git源更新自己,如果想使用清華的映象源進行更新,可以將如下內容複製到你的~/.bashrc裡
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
複製程式碼
並重啟終端模擬器。
#下載原始碼
首先我們先建立一個工作目錄,下載的原始碼和編譯的輸出都將在這個目錄:
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
複製程式碼
初始化倉庫:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r52
複製程式碼
同步原始碼樹:
repo sync -j4
複製程式碼
注意:-j後面的引數不要太大,否則會出現 503 錯誤,同時此過程要儘量保證網路不要中斷,雖然repo sync支援斷電續傳,但不是純粹的斷點續傳,之前下載完成的檔案會直接跳過,但是中斷的時候未下載完的檔案,會重新下載,之後要記得清理。
清理快取檔案:
find . -iname tmp_pack_* | xargs rm
複製程式碼
#下載專有驅動
因為我們最終是要燒錄到物理裝置上,所以需要下載專有驅動,如果是執行在模擬器,這一步可以忽略
以Nexus 5X為例,我們需要下載的驅動如下:
硬體 | 供應商 | 連結 |
---|---|---|
Vendor image | LG | 下載 |
GPS, Audio, Camera, Gestures, Graphics, DRM, Video, Sensors | Qualcomm | 下載 |
這些壓縮包中都是自解壓指令碼,從原始碼樹的根目錄執行附帶的自解壓指令碼,然後確認同意附帶的許可協議的條款。二進位制檔案及其對應的 Makefile 將會安裝在原始碼樹的 vendor/ 目錄中
由於我們之前並沒有進行任何編譯,所以不需要執行特定的清理操作,否則,請在編譯前清理已有編譯的輸出:
make clobber
複製程式碼
#開始編譯 1.首先初始化指令碼
source build/envsetup.sh
複製程式碼
在這一步,指令碼會為我們初始化很多編譯必須的工具
2.選擇編譯目標
lunch
複製程式碼
該命令會幫我們列出當前版本支援的編譯目標
需要注意的是這裡輸出的編譯目標都是以手機代號的形式呈現的,Nexus 5x的代號為bullhead
接下來是編譯型別的選擇
編譯型別 | 使用情況 |
---|---|
user | 許可權受限;適用於生產環境 |
userdebug | 與“user”類似,但具有 root 許可權和可除錯性;是進行除錯時的首選編譯型別 |
eng | 具有額外除錯工具的開發配置 |
我們後期需要對系統進行除錯,所以這裡我們選擇aosp_bullhead-userdebug,輸入29後回車選擇,之後系統會針對選定的編譯目標進行編譯配置
3.執行編譯
make -j16
複製程式碼
注意:-j後面的引數可以根據自己分配給虛擬機器的CPU情況來定,例如,筆者分配給虛擬機器1個CPU,每個CPU8個核心,每個核心2個執行緒,要實現最快的編譯速度,可以使用介於 make -j16 到 make -j32 之間的命令
當然這一步通常並不會一帆風順,總會有各種問題出現,比較常見的有:
Out of memory error:
這是由於Java的堆記憶體溢位造成的,解決方法為:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
複製程式碼
然後繼續執行編譯
4.編譯成功
這個編譯時間和硬體配置有關,筆者的電腦最終編譯完成耗時1小時多一點
#刷入裝置
1.配置 USB 使用許可權
如果在 Ubuntu Linux 上開發,需要為想要在開發中使用的每一種裝置型別新增一個包含 USB 配置的 udev 規則檔案。在規則檔案中,每一個裝置製造商都由一個唯一的供應商 ID,部分供應商ID如下圖:
(1)建立規則檔案:
sudo gedit /etc/udev/rules.d/51-android.rules
複製程式碼
(2)使用下面的格式將供應商新增到檔案中:
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
複製程式碼
注意:Nexus 5X的供應商應是Google,不是LG
(3)設定檔案許可權:
chmod a+r /etc/udev/rules.d/51-android.rules
複製程式碼
現在將裝置重新拔下並插上,adb驗證一下是否能夠識別到:
adb devices
複製程式碼
(4)裝置連線成功之後,現在要進入fastboot模式:
adb reboot bootloader
複製程式碼
(5)在裝置處於 fastboot 模式後,執行以下命令刷寫整個Android系統:
fastboot flashall -w
複製程式碼
執行此命令之前需要先對裝置解鎖,-w 選項會清除裝置上的 /data 分割槽;該選項在第一次刷寫特定裝置時非常有用,但在其他情況下則沒必要使用。
刷寫完成之後,系統會自動重啟
#最後,附上成果: