AOSP SetUp(三)- Build:「構建 Android OS」

Android:AOSP

RICK
Jul 21, 2020

概要

這篇文章的主要目標是要學習如何將「AOSP」專案原始碼進行編譯與構建,本篇文章主要參考資料為「AOSP / Set up / BUILD / Building」。

本文為系列文的後續,因此僅說明編譯的過程與步驟,關於編譯過程所需的套件及安裝指令請參考本系列先前的文章。

正文

啟用編譯環境

此處原文為「Set up environment」,其主要是要將編譯所需的工具或套件載入。

此步驟的目的是在啟用「envsetup.sh」此腳本,在該腳本中有定義著一些在編譯過程會使用到的命令,像是「m」、「lunch」以及「croot」…等,如下圖:

envsetup.sh」是由 Google 所撰寫的「腳本」,其中定義了許多與編譯相關的指令,事實上,我們可以去查閱其「內容」。

備註:在此處的「.」與「source」的效果是相同的,「.」只是「source」縮寫,事實上,我們更常使用縮寫的「.」來取代「source」。

首先,我們將目標移至「AOSP」專案的根目錄底下,如下圖:

接著,輸入「啟用編譯環境」的指令,如下:

. build/envsetup.sh

這樣就完成了「啟用編譯環境」的步驟了,也就是說,此時我們已經可以使用「envsetup.sh」內的所有指令了。

選擇專案項目

在此,我們可以透過指令「lunch」來顯示所有的專案項目,指令如下:

lunch

結果如下圖:

囧了吧?事實上,我們可以根據名字的內容來選擇我們所需要的項目;我們至少可以從項目的名稱中得到兩項資訊,分別為「Build Version」和「Build Type」。

首先介紹的是「Build Version」,中文譯作「編譯版本」,就如同我們先前在下載原始碼一樣,我們會依據我們所需求的版本不同而下載不同代號的原始碼;同樣的,我們也會依照我們持有手機型號的不同而編譯不同代號的原始碼:「對照表連結」,圖如下:

而筆者的「測試手機」是「Pixel」,因此選擇的代號是「sailfish」,圖如下:

接著,我們要選擇「Build Type」,官方說明如下:

簡單的說就是「build type」則分為「user」、「user-debug」及「eng」三種種類。

其中「user」指的是正式產品的版本,一般來說,該版本必須是經過嚴格測試的穩定版本,並可供量產、販售之使用,但也因此其權限常受到限制,使得不利於開發或除錯。

而「user-debug」顧名思義就是「debug」專用的版本,其實「user-debug」和「user」不論是在功能或內容上都不會有太多差異,其最大的區別僅在於「權限」而已,實務上,通常「user-debug」版會允許取得「root」權限,以方便工程師除錯。

最後就是工程版:「eng」,也就是開發時的版本,此版本通常比較不穩定外,但好處就是會有各種神秘的「後門」或「小工具」,但除非是開發中,不然我們鮮少會去使用該版本,因為它藏滿著「Bug」。

綜合上述,筆者選擇了「16. aosp_sailfish-userdebug」,如下:

因此,我們只要在指令列中輸入「16」,並按下「Enter」即可。

順帶一提,我們亦可以直接將完整的版本資訊輸入來指定我們想要編譯的版本,官方說明如下:

這樣的語法在撰寫腳本時非常的方便。

開始編譯

顧名思義,官方文件的說明如下圖:

基本上就是輸入指令「m」即可,如下:

m

但我們可以透過參數來控制編譯的過程。

例如輸入參數「-j」可以控制編譯時所佔用的資源,一般而言,官方建議的「參數值」為「CPU 核心數」的兩倍,若該值輸入超過最大值,則系統將以最大值為準;若未輸入該參數,則系統將會自行給予適合的參數。

事實上,為了能夠更好的控制編譯所占資源,筆者在下指令時通常會加入控制參數「-jN」,至於「N」是多少,通常是取決於我當下的狀態,若我當時仍需要使用該台電腦工作,通常我就會限制其核心數,反之,我通常會開啟「最大值」。

當我們按下「Enter」後,系統就會開始編譯我們所選擇的「AOSP」項目,至此,編譯開始,接著就又是漫長的等待了,直到編譯完成,如下圖:

附帶一提,除了「-j」,還有一些常用的且關於編譯的參數,下圖為常見參數與其代表之意義:

總結

至此,我們已經成功編譯了「Android OS」,而本系列文也在這邊結束。

--

--

RICK
RICK

Written by RICK

當遇到重開機無法解決的 BUG 時,那就試試關機吧。

No responses yet