通過Ubuntu20.04虛擬機編譯AOSP11
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
今年早些時候編譯并燒錄過OpenHarmony系統(tǒng),從1.0版本到2.0版本變化很大,都有在3516開發(fā)板上跑過,雖然說2.0增加了Linux內(nèi)核,界面更接近手機系統(tǒng),但是離真正的HarmonyOS還相去甚遠,如果想達到手機端HarmonyOS的效果,可能需要結(jié)合OpenHarmony框架和AOSP內(nèi)核,今天就先來嘗試自己編譯一下AOSP11,為之后可能進行的探索做一些預(yù)研。
前期準備
- 硬件設(shè)備當然是配置越高越好,虛擬機編譯至少需要16G內(nèi)存+300G硬盤空間,我自己的臺式機是加到了24G內(nèi)存,之前內(nèi)存只有8G,剛開始就編不過去。
- 軟件環(huán)境我用的是VMware+Ubuntu 20.04系統(tǒng)的虛擬機,虛擬機的安裝這里就不多說了,網(wǎng)上有很多。
配置下載源
因為國外地址可能訪問不了或者訪問速度慢,我們需要添加國內(nèi)數(shù)據(jù)源:
打開源列表
- sudo gedit /etc/apt/sources.list
把清華源復(fù)制到源列表,之前的源不要動
- deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
- deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
- deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
- deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
- deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
- deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
- deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
- deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
保存之后更新源
- sudo apt-get update
- sudo apt-get upgrade
下載源碼
配置好國內(nèi)的數(shù)據(jù)源之后,我們就可以開始源代碼的下載了,網(wǎng)速要盡量快,因為AOSP的源代碼光壓縮包就有124G,網(wǎng)速不好下載花的時間就太長了。
這里不推薦大家下載壓縮包再解壓,因為我們的硬盤容量有限,我這里預(yù)留了300G的空間,不足以讓一個124G的壓縮包完成解壓,因此,我選擇直接下載源文件。
下載git,配置環(huán)境變量
- #安裝git,配置自己的git賬號
- sudo apt-get install git
- git config --global user.email "xxxx@xx.com"
- git config --global user.name "xxxx"
- #配置PATH環(huán)境變量
- mkdir ~/bin
- echo "PATH=~/bin:\$PATH" >> ~/.bashrc
- source ~/.bashrc
安裝curl
- sudo apt-get install curl
下載repo
- PATH=~/bin:$PATH
- curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
- chmod a+x ~/bin/repo
下載AOSP源碼
- #創(chuàng)建并初始化aosp倉庫目錄
- mkdir aosp
- cd aosp
- repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-11.0.0_r3 --repo-url=https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
- #同步代碼
- repo sync
等待代碼下載完之后,我們就可以開始編譯了。
編譯
安裝依賴庫,AOSP編譯需要依賴很多庫,而這些Ubuntu系統(tǒng)可能沒有自帶,因此我們需要提前安裝,避免編譯到一半報錯浪費時間。
- 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-markdown libxml2-utils xsltproc zlib1g-dev:i386
- 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
- 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
- sudo apt-get install libncurses5
初始化編譯環(huán)境,執(zhí)行編譯命令
- source build/envsetup.sh
- lunch 31


通過lunch指令設(shè)置編譯目標,就是生成的鏡像要運行在什么樣的設(shè)備上,我這里是準備在模擬器上跑所以選擇31(即aosp_x86_64-eng),模擬器是x86的平臺,運行速度會更快。這里也可以用編譯目標名稱如lunch aosp_x86_64-eng,因為不同版本的編譯目標名稱序號并不相同。
編譯目標的格式:BUILD-BUILDTYPE,比如上面的aosp_x86_64-eng的BUILD是aosp_x86_64,BUILDTYPE是eng。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則指的是編譯類型,通常有三種:
- -user:代表這是編譯出的系統(tǒng)鏡像是可以用來正式發(fā)布到市場的版本,其權(quán)限是被限制的(如,沒有root權(quán)限,不能dedug等)
- -userdebug:在user版本的基礎(chǔ)上開放了root權(quán)限和debug權(quán)限。
- -eng:代表engineer,也就是所謂的開發(fā)工程師的版本,擁有最大的權(quán)限(root等),此外還附帶了許多debug工具。
選擇完編譯目標之后會打印出對應(yīng)平臺的編譯參數(shù)。

- make -j8
通過make指令進行代碼編譯,該指令通過-j參數(shù)來設(shè)置參與編譯的線程數(shù)量,以提高編譯速度。需要注意的是,參與編譯的線程并不是越多越好,通常是根據(jù)你機器cup的核心來確定:core*2,即當前cpu的核心的2倍。我的臺式機是i7四核處理器,所以這里可以用8線程編譯。
接下來就是漫長的等待,如果沒有缺少依賴庫,會在幾個小時之后看到編譯成功的信息,編譯時間取決于你機器的性能。

這是我虛擬機編譯時候的資源占用情況,CPU應(yīng)該是夠用的,使用率一直在50%左右,而內(nèi)存消耗達到了20G,可見AOSP編譯對內(nèi)存要求相當高,而當我們編譯到90%進度的時候,會生成大量文件,對硬盤讀寫速率要求也很高,我這里用機械硬盤,讀寫速率最多在十幾M,因此在生成文件時硬盤使用率一直在100%,如果有條件可以用固態(tài)硬盤來編譯,速度應(yīng)該會快很多。

六個多小時后,終于編譯完成了。
運行模擬器
在編譯完成之后,就可以通過以下命令運行Android模擬器了,命令如下:
- source build/envsetup.sh
- lunch(選擇剛才你設(shè)置的目標版本,比如這里我選擇的是31)
- emulator
如果你是在編譯完后立刻運行模擬器,由于我們之前已經(jīng)執(zhí)行過source及l(fā)unch命令了,因此現(xiàn)在你只需要執(zhí)行命令就可以運行模擬器:
- emulator
這里如果你的虛擬機沒有開啟虛擬化功能,是不能直接跑模擬器的,會報錯,這時,需要關(guān)閉虛擬機,配置虛擬化選項。

然后重啟虛擬機,進入aosp目錄再運行模擬器就可以了,這里直接用emulator會報找不到命令的錯誤,因為我們重啟了虛擬機,需要重新初始化我們剛才編譯的環(huán)境:
- source build/envsetup.sh
- lunch 31
- emulator

這樣,便使用我們自己編譯的AOSP鏡像啟動了Android模擬器,可以看到,這個模擬器的界面和我們平時看到的谷歌原生系統(tǒng)是有區(qū)別的,因為谷歌系統(tǒng)自帶的很多應(yīng)用并不是開源的,這里安裝的都是AOSP內(nèi)自帶的demo應(yīng)用,界面也沒有谷歌原生系統(tǒng)漂亮。
至此,整個AOSP的編譯過程就結(jié)束了,總的來說,機器硬件是硬性要求,其他方面,編譯命令也非常簡單,編譯腳本都已經(jīng)寫好了,自動化程度非常高,相比之下鴻蒙系統(tǒng)要自己搭建編譯環(huán)境就麻煩的多了,而AOSP的編譯更類似于鴻蒙的docker編譯方式,整套環(huán)境比較完善,需要額外安裝或配置的不多。AOSP編譯完成后,會在out/target/product/generic_x86/目錄生成一些img文件,而模擬器啟動主要用到了這里面的三個文件system.img,userdata.img和ramdisk.img,Linux Kernel則是使用prebuilds目錄下對應(yīng)平臺的kernel文件,這些文件在我們編譯openharmony的過程中也接觸過,十分類似,當我們需要燒錄系統(tǒng)的時候,用到的也是這些文件。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)