AOSP SetUp(三)- Build:「構建 Android OS」
概要
這篇文章的主要目標是要學習如何將「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」,而本系列文也在這邊結束。