Ubuntu14.04下編譯Android8.1.0原始碼並刷入到裝置

U2tzJTNE發表於2019-04-01

#編譯環境

軟體平臺 -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如下:

(1)下載.deb 軟體包:

(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後回車選擇,之後系統會針對選定的編譯目標進行編譯配置

Ubuntu14.04下編譯Android8.1.0原始碼並刷入到裝置

3.執行編譯

make -j16
複製程式碼

注意:-j後面的引數可以根據自己分配給虛擬機器的CPU情況來定,例如,筆者分配給虛擬機器1個CPU,每個CPU8個核心,每個核心2個執行緒,要實現最快的編譯速度,可以使用介於 make -j16 到 make -j32 之間的命令

當然這一步通常並不會一帆風順,總會有各種問題出現,比較常見的有: Out of memory error:

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如下圖:

部分供應商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
複製程式碼

Ubuntu14.04下編譯Android8.1.0原始碼並刷入到裝置

(4)裝置連線成功之後,現在要進入fastboot模式:

adb reboot bootloader
複製程式碼

(5)在裝置處於 fastboot 模式後,執行以下命令刷寫整個Android系統:

fastboot flashall -w
複製程式碼

執行此命令之前需要先對裝置解鎖,-w 選項會清除裝置上的 /data 分割槽;該選項在第一次刷寫特定裝置時非常有用,但在其他情況下則沒必要使用。

刷寫完成之後,系統會自動重啟

#最後,附上成果:

Ubuntu14.04下編譯Android8.1.0原始碼並刷入到裝置

相關文章