Android Open Source Project 本地編譯流程記錄

前言

本文以Ubuntu22.04、AOSP13代碼為例,
演示了從安裝環(huán)境, 下載代碼, 到編譯映像和搭建本地AOSP代碼鏡像服務(wù)器的全部過程。

1、安裝Repo

cd ~
mkdir bin
PATH=~/bin:$PATH

2、初始化Repo

Google官方地址

sudo apt-get install curl
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

如果電腦不支持訪問Google官方地址,可以使用下面清華的源進行替換

sudo apt-get install curl
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo

3、添加環(huán)境配置(可選)

repo運行過程中會嘗試訪問官方的git源更新自己,如果使用清華的鏡像源進行更新,需要添加環(huán)境配置
過程如下:

sudo apt-get install vim
vim .bashrc(不安裝vim也可, 可以直接用gedit編輯)

#末尾添加
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

#執(zhí)行(使配置生效)
source .bashrc

4、配置git

使用自己郵箱的用戶名以及郵箱地址即可

sudo apt-get install git
git config --global user.name "XXXX"
git config --global user.email "XXXXX@XXXXXXXXX.com"

5、創(chuàng)建用于下載源碼的文件夾

mkdir -p aosp/android13
cd aosp/android13/

6、拉取代碼

使用Google的源

repo init -u https://android.googlesource.com/platform/manifest

#如需簽出 master 分支,請運行以下命令:
repo init -u https://android.googlesource.com/platform/manifest -b master

#如需簽出 master 之外的其他分支,請使用 -b 指定此分支。官方文檔可以查看可以拉取到哪些分支
#https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds

使用清華的源:

# 此處以拉取android-13.0.0_r37分支為例
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r37

執(zhí)行完該命令,會提示沒有Python的問題



查看谷歌官網(wǎng),給出解決方式如下

sudo ln -s /usr/bin/python3 /usr/bin/python


嘗試重新拉取代碼


7、同步代碼

repo sync -j8(推薦使用j4或者$(nproc --all))

8、安裝依賴庫

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev (找不到)
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev(ubutun20也找不到,會被安裝6,下面有解決辦法)
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt-get install libssl-dev

特別注意:如遇到 libesd0-dev 找不到,執(zhí)行下面的

sudo vim /etc/apt/sources.list
#在行尾添加下面這個源保存
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
 
#安裝libesd0-dev
sudo apt-get update && sudo apt-get install libesd0-dev

關(guān)于編譯時報 lib32ncurses5-dev的問題,這個包安裝不上。在安裝的時候發(fā)現(xiàn)要安裝libncurses5-dev,但是軟件包都更新為最新版本的了,也就是libncurses5-dev 最新版本是6.2的,查看了下/usr/lib/x86_64-linux-gnu 這個目錄下的動態(tài)庫,發(fā)現(xiàn)只有l(wèi)ibncurses.so.6,這就是因為libncurses5-dev這個包太新了,已經(jīng)更新到6.2了,所以沒有l(wèi)ibncurses.so.5,因為后面編譯需要有l(wèi)ibncurses.so.5,不然編譯會報錯。


cd /usr/lib/x86_64-linux-gnu 
sudo cp libncurses.so.6 libncurses.so.5
sudo cp libtinfo.so.6 libtinfo.so.5

9、開始編譯

source build/envsetup.sh
lunch 1
make -j8(或者$(nproc --all))

step1:執(zhí)行envsetup腳本
腳本文件envsetup.sh記錄著編譯過程中所需要的各種函數(shù)實現(xiàn),如lunch、m、mm等??梢愿鶕?jù)項目需求進行一定的修改。
step2:選擇編譯目標
編譯目標由兩部分組成,即BUILD和BUILDTYPE
編譯目標的格式:BUILD-BUILDTYPE,例如:aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng。
Build:

BUILD指的是特定功能的組合的特定名稱,即表示編譯出的鏡像可以運行在什么環(huán)境.
其中,aosp(Android Open Source Project)代表Android開源項目;
arm表示系統(tǒng)是運行在arm架構(gòu)的處理器上,
arm64則是指64位arm架構(gòu)處理器,
x86則表示x86架構(gòu)的處理器。

BUILD TYPE:

BUILD TYPE則指的是編譯類型,通常有三種:
 -user:代表這是編譯出的系統(tǒng)鏡像是可以用來正式發(fā)布到市場的版本,其權(quán)限是被限制的(如,沒有root權(quán)限)
 -userdebug:在user版本的基礎(chǔ)上開放了root權(quán)限和debug權(quán)限.
 -eng:代表engineer,也就是所謂的開發(fā)工程師的版本,擁有最大的權(quán)限(root等),此外還附帶了許多debug工具

了解編譯目標的組成之后,就可以根據(jù)目前的情況選擇響應(yīng)的編譯目標,如果不知道有哪些類型可以選擇,
可以執(zhí)行不帶參數(shù)的lunch指令,控制臺會列出所有的編譯目標,可以根據(jù)提示進行選擇,只需要輸入相應(yīng)的數(shù)字即可。


step3:執(zhí)行編譯命令
通過make指令進行代碼編譯,該指令通過-j參數(shù)來設(shè)置參與編譯的線程數(shù)量,以提高編譯速度.比如設(shè)置8個線程同時編譯:make -j8
參與編譯的線程并不是越多越好,通常是根據(jù)機器cup的核心來確定:core*2,即當(dāng)前cpu的核心的2倍。
執(zhí)行make命令之后,等待即可

10、參考鏈接

Google官方鏈接
Ubuntu20編譯最新版Android源碼教程
ubuntu 20.04.4編譯 繼續(xù)嘗試編譯Android 12,13

11、補充說明

[1].清理命令

# 執(zhí)行清理操作,等價于 rm -rf $OUT
make clean

# 為了確保新安裝的二進制文件在解壓后會被適當(dāng)考慮在內(nèi),可使用以下命令刪除所有以前編譯操作的已有輸出, 等價于rm -rf out/
make clobber

make clean與make clobber的區(qū)別
在你build for devices的時候(需要解壓一些私有的驅(qū)動與安裝包),google會建議使用make clobber進行清除操作,以避免之前進行的build干擾到接下來的build。
make clean:它會刪除本次設(shè)置所生成的所有的output與中間文件。等價于指令rm -rf OUT,這里的OUT指的是out/target/product/[product_name]
make clobber:make clobber的功能是把上一次make命令生成的文件或目錄清除掉,效果比make clean更嚴格。它會刪除所有設(shè)置所生成的所有的output與中間文件。等價于指令rm -rf out/,make clobber的嚴格在于它把整個out目錄都刪除了。
其他:


[2].設(shè)立ccache(可選)
如果經(jīng)常執(zhí)行“make clean”,或者需要經(jīng)常編譯不同的產(chǎn)品類別,設(shè)立ccache還是有必要的。它可以作為編譯時的緩沖,從而加快重新編譯的速度。
設(shè)置方法:

  • 安裝:sudo apt-get install ccache
  • 要想長久方便使用,需要將以下環(huán)境變量寫入/etc/profile或者~/.bashrc中
    1. export USE_CCACHE=1
    2. export CCACHE_DIR=/<path_of_your_choice>/.ccache
      其中<path_of_your_choice>是要設(shè)置ccache緩存的目錄,如果不設(shè)置,則默認緩存到~/.ccache中。
  • 然后進入Android源碼的編譯目錄,執(zhí)行:
    1. prebuilts/misc/linux-x86/ccache/ccache -M 50G
  • 后面繼續(xù)執(zhí)行:
    1. source build/envsetup.sh
    2. lunch xxxxx
    3. make -j16

注意事項:

  • 上面的設(shè)置會永久存儲在CCACHE_DIR中。
  • 可通過ccache -s查看緩存使用情況,通過ccache -C清除緩存

[3].AOSP Git鏡像
下載AOSP git 鏡像, 在局域網(wǎng)搭建AOSP mirror
為了減少拉取代碼時的時間,方便團隊開發(fā),提高開發(fā)效率,可以為整個服務(wù)器內(nèi)容創(chuàng)建本地鏡像,并從該鏡像同步客戶端(不需要訪問遠程服務(wù)器)
step1:創(chuàng)建局域網(wǎng)內(nèi)鏡像服務(wù)器

# 在局域網(wǎng)鏡像服務(wù)器中創(chuàng)建Git鏡像文件夾
mkdir -p /usr/local/aosp/mirror

# 使用repo下載Google源或者清華源鏡像
cd /usr/local/aosp/mirror
repo init -u https://android.googlesource.com/mirror/manifest --mirror
# 或者
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/mirror/manifest --mirror

repo sync

在本地服務(wù)器同步鏡像后, 執(zhí)行以下命令創(chuàng)建AOSP鏡像服務(wù)
git daemon --verbose --export-all --base-path=WORKING_DIR WORKING_DIR
step2:使用局域網(wǎng)鏡像服務(wù)器下載代碼
在局域網(wǎng)鏡像服務(wù)器本地同步代碼

mkdir -p /usr/local/aosp/local13
cd /usr/local/aosp/local13
repo init -u /usr/local/aosp/mirror/platform/manifest.git -b android-13.0.0_r37
repo sync

在使用局域網(wǎng)連接鏡像服務(wù)器同步代碼

mkdir -p /usr/local/aosp/AOSPlocalserver13
cd /usr/local/aosp/AOSPlocalserver13
repo init -u git://ip.to.mirror/platform/manifest.git -b android-13.0.0_r37
repo sync

最后,要將客戶端與服務(wù)器同步,先將鏡像與服務(wù)器同步,然后再將客戶端與鏡像同步:

# 服務(wù)機
cd /usr/local/aosp/mirror
repo sync

# 客戶機
cd /usr/local/aosp/AOSPlocalserver13
repo sync

可以將鏡像存儲在 LAN 服務(wù)器上,然后通過 NFS、SSH 或 Git 訪問它。您還可以將其存儲在移動存儲盤上,并在用戶之間或計算機之間傳遞該存儲盤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容