AOSP 編譯Android12源碼全記錄

編譯源碼基本上都是在linux環(huán)境下編譯,所以我們?cè)趙indow系統(tǒng)中使用虛擬機(jī)安裝ubuntu系統(tǒng)來(lái)編譯

1.虛擬機(jī)安裝 Ubuntu

首先是下載Ubuntu系統(tǒng)鏡像,我一開(kāi)始下載的ubuntu官網(wǎng)上最新版Ubuntu 22.04 LTS,后來(lái)repo同步 android12源碼的時(shí)候始終失敗,但同步 android9源碼會(huì)成功,后來(lái)?yè)Q了Ubuntu18.04 LTS,終于repo同步成功。
簡(jiǎn)單說(shuō)下載Ubuntu18.04 LTS版本,切記切記Ubuntu官網(wǎng)下載
拉到最下面就是:

企業(yè)微信截圖_1655184658939.png

不排除是我人品太差,你們可以試試這22.04版本。

安裝Ubuntu前提一嘴:

1.如果你的電腦內(nèi)存足夠大,比如32G,那么在按照下面的安裝步驟進(jìn)行到給Ubuntu分配內(nèi)存的時(shí)候,直接分配20G以上,會(huì)讓你少走很多彎路。我的電腦總共16G,Ubuntu分配了8G。
2.給Ubuntu分配磁盤(pán)空間的時(shí)候至少分配200G,因?yàn)樵创a下載下來(lái)很大
3.安裝Ubuntu過(guò)程中遇到安裝界面被遮擋點(diǎn)不了“下一步”按鈕,嘗試按住win鍵然后鼠標(biāo)拖動(dòng)界面

然后下載虛擬機(jī),VirtualBox 和VMware workstation 二選一:

VirtualBox安裝Ubuntu
VMware安裝Ubuntu
我用的VMware

2.下載AOSP源碼

AOSP(Android Open Source Project)是Google開(kāi)放的Android 開(kāi)源項(xiàng)目,中文官網(wǎng)為:https://source.android.google.cn/
AOSP通俗來(lái)講就是一個(gè)Android系統(tǒng)源碼項(xiàng)目,通過(guò)它可以定制 Android 操作系統(tǒng),國(guó)內(nèi)手機(jī)廠(chǎng)商都是在此基礎(chǔ)上開(kāi)發(fā)的定制系統(tǒng)。因?yàn)閴Φ木壒剩绻麩o(wú)法連接谷歌服務(wù)器獲取AOSP源碼,可以從 清華大學(xué)鏡像站或者 中科大鏡像。本篇文章以清華大學(xué)鏡像站為例。

2.1下載 repo工具

Android源碼包含數(shù)百個(gè)git庫(kù),光是下載這么多的git庫(kù)就是一項(xiàng)繁重的任務(wù),所以Google開(kāi)發(fā)了repo,它是用于管理Android版本庫(kù)的一個(gè)工具,使用了Python對(duì)git進(jìn)行了一定的封裝,簡(jiǎn)化了對(duì)多個(gè)Git版本庫(kù)的管理。

安裝 Git,在Ubuntu 終端輸入如下命令:

sudo apt-get install git

設(shè)置git身份,添加自己的郵箱和姓名:

git config --global user.email "xxxx@qq.com"
git config --global user.name "xxxx"

創(chuàng)建bin,并加入到PATH中:

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

安裝curl庫(kù):

sudo apt-get install curl

下載repo并設(shè)置權(quán)限:

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo

安裝python,repo初始化時(shí)會(huì)用到:

sudo apt-get install python

2.2下載源碼

下載源碼大概有兩種方式(參考清華源AOSP):1.使用每月更新的初始化包;2.傳統(tǒng)初始化方法
網(wǎng)上aosp編譯教程大多數(shù)選擇的是傳統(tǒng)初始化方法,這里我把2種都列出來(lái)

2.2.1 使用每月更新的初始化包

這個(gè)方式對(duì)磁盤(pán)空間要求較大,初始化包是個(gè)壓縮包大概在190G左右,然后還得解壓,所以磁盤(pán)要求起碼400G起步,如果你在之前安裝Ubuntu的時(shí)候分配的空間不足400G要么進(jìn)行擴(kuò)容,要么使用2.2.2傳統(tǒng)初始化方法。

使用每月更新的初始化包
我們強(qiáng)烈建議您使用初始化包進(jìn)行初始化。
下載 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下載完成后記得根據(jù) checksum.txt 的內(nèi)容校驗(yàn)一下。
由于所有代碼都是從隱藏的 .repo 目錄中 checkout 出來(lái)的,所以我們只保留了 .repo 目錄,下載后解壓 再 repo sync 一遍即可得到完整的目錄。

首先我們先下載這個(gè)aosp-latest.tar,這個(gè)包接近200G因?yàn)樗怂邪姹拘畔?!如果覺(jué)得太大,請(qǐng)看2.2.2傳統(tǒng)方法。
可以在ubuntu使用終端命令下載,也可以在windows里使用迅雷等工具下載然后再通過(guò)共享文件夾復(fù)制到ubuntu里,然后解壓 ,然后把代碼checkout出來(lái) checkout參考清華源AOSP,在ubuntu里下載也參考清華源AOSP

2.2.2 傳統(tǒng)初始化方法

建立工作目錄 :

mkdir aosp_12
cd aosp_12

repo的運(yùn)行過(guò)程中會(huì)嘗試訪(fǎng)問(wèn)官方的git源更新repo自己,如果想使用tuna的鏡像源進(jìn)行更新,可以將如下內(nèi)容復(fù)制到你的~/.bashrc里

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

找不到.bashrc文件?
打開(kāi)Ubuntu桌面的文件 ,如圖:


image.png

按快捷鍵crtl+H 顯示隱藏文件,即可看到


6.png

初始化倉(cāng)庫(kù):

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

初始化并指定版本:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0.0_r8

這里我下載的是android12源碼,android所有版本參考:https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds

同步源碼:

repo sync

然后等待即可,幾個(gè)小時(shí)左右吧。可能我人品太差,我一開(kāi)始在ubuntu22.04上下載源碼,下了幾天嘗試多次都不成功。后來(lái)使用ubuntu18.04一次成功。
成功會(huì)類(lèi)似下圖:


4.png

2.3下載內(nèi)核源碼

AOSP源碼中并不包括內(nèi)核源碼,需要單獨(dú)下載,內(nèi)核源碼有很多版本,比如common是通用的Linux內(nèi)核,msm是用于使用高通MSM芯片的Android設(shè)備,goldfish是用于A(yíng)ndroid模擬器的內(nèi)核源碼,這里以goldfish為例。

和下載AOSP源碼一樣,我們需要先建立工作目錄 :

mkdir kernel
cd kernel

使用清華的鏡像:

git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git

完成后kernel目錄中會(huì)生成一個(gè)goldfish文件夾,進(jìn)入goldfish目錄并使用git命令

cd goldfish
git branch -a

這時(shí)會(huì)列出有哪些內(nèi)核的版本分支可以下載


MEYoHH.png

這里選擇下載goldfish 3.4版本

git checkout remotes/origin/android-goldfish-3.4

3.開(kāi)始編譯源碼

3.1準(zhǔn)備編譯環(huán)境

安裝 jdk8

sudo apt-get update
sudo apt-get install openjdk-8-jdk

安裝依賴(lài)包

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 ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

設(shè)置Ubuntu處理器數(shù)量

Ubuntu關(guān)機(jī),在VirtualBox主頁(yè)進(jìn)入U(xiǎn)buntu右側(cè)設(shè)置–>系統(tǒng)–>處理器選項(xiàng),設(shè)置處理器數(shù)量,設(shè)置最大處理器數(shù)量的一半或更高,也不要設(shè)置最大,容易卡主,我設(shè)置了一半。

3.2給Ubuntu增加虛擬內(nèi)存

為什么要增加虛擬內(nèi)存?編譯Android12源碼的時(shí)候提示如下:

image.png

意思是需要16G左右的內(nèi)存(實(shí)測(cè)已經(jīng)超過(guò)16G,如果你沒(méi)有分配20G還是使用虛擬內(nèi)存吧),而我們之前安裝Ubuntu的時(shí)候只分配了8G,編譯一定會(huì)失??!Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
已經(jīng)分配20G內(nèi)存的跳到段落3.3繼續(xù)
所以需要添加虛擬內(nèi)存(swap交換空間)

Linux 的交換分區(qū)(swap),或者叫內(nèi)存置換空間(swap space),是磁盤(pán)上的一塊區(qū)域,可以是一個(gè)分區(qū),也可以是一個(gè)文件,或者是他們的組合。交換分區(qū)的作用是,當(dāng)系統(tǒng)物理內(nèi)存吃緊時(shí),Linux 會(huì)將內(nèi)存中不常訪(fǎng)問(wèn)的數(shù)據(jù)保存到 swap 上,這樣系統(tǒng)就有更多的物理內(nèi)存為各個(gè)進(jìn)程服務(wù),而當(dāng)系統(tǒng)需要訪(fǎng)問(wèn) swap 上存儲(chǔ)的內(nèi)容時(shí),再將 swap 上的數(shù)據(jù)加載到內(nèi)存中,也就是常說(shuō)的 swap out 和 swap in。

首先查看是否已經(jīng)存在交換空間,終端輸入:

free -m

我們安裝的Ubuntu默認(rèn)有2G大小的swap空間,如圖


企業(yè)微信截圖_16553488731383.png

使用以下命令查看swap詳情:

swapon -s
企業(yè)微信截圖_16553494615497.png

可以看到我們Ubuntu上的默認(rèn)的swap是存放在根目錄的swapfile文件,我們?nèi)ジ夸浾乙幌驴纯?,進(jìn)入根目錄方法:

打開(kāi)ubuntu桌面“文件”->點(diǎn)擊其他位置->點(diǎn)擊計(jì)算機(jī) 即可查看到

我們可以看到swapfile文件,2.1G沒(méi)有錯(cuò)
企業(yè)微信截圖_1655349219681.png
3.2.1 已存在swap交換空間

如果swap空間超過(guò)16G,則跳到3.3步驟;
如果swap空間沒(méi)有16G,那么我們給它擴(kuò)容,默認(rèn)只有2G,那么我們給它擴(kuò)容(其實(shí)就是停用刪除這個(gè)小的,然后重新創(chuàng)建啟用一個(gè)大的)

停用交換文件:

sudo swapoff /swapfile

刪除文件:

sudo rm /swapfile

刪除后繼續(xù)創(chuàng)建↓

3.2.2 創(chuàng)建swap交換空間

新建swap空間,以16G為例,創(chuàng)建文件:

sudo fallocate -l 16G /swapfile 

這里我們還是命名為“swapfile”,當(dāng)然你也可以隨意寫(xiě)
查看文件信息:

ls -lh  /swapfile
企業(yè)微信截圖_16553504819787.png

設(shè)置文件權(quán)限:

sudo chmod 600 /swapfile

再次查看文件信息,權(quán)限已改變:


1.png

掛載:

sudo mkswap /swapfile

激活啟用:

sudo swapon /swapfile

再次查看內(nèi)存使用情況:

free -m
2.png

發(fā)現(xiàn)交換空間 16G,然后還有重要的一步把交換信息寫(xiě)入系統(tǒng)配置,不然Ubuntu重啟后以上配置swap空間工作得重新做

使用vim編輯器打開(kāi)配置文件:

sudo vim /etc/fstab

如果提示vim找不到命令,使用以下命令安裝vim,然后再次打開(kāi)配置文件

sudo apt-get install vim

打開(kāi)配置文件如下:


3.png

發(fā)現(xiàn)已經(jīng)存在/swapfile 這條信息,并且你后來(lái)創(chuàng)建的16G的文件使用的名字依然是“swapfile ”,那么我們直接退出編輯器,不用修改
如果你起的是別的名字,那么需要進(jìn)行配置。

最后一行插入(vim打開(kāi)后按i進(jìn)入編輯模式,移動(dòng)光標(biāo)到最后回車(chē)換行):

/swapfile  swap  swap  defaults  0  0

編輯好之后按ESC鍵退出編輯模式,然后依次輸入:wq(英文冒號(hào)+wq)保存退出

重啟Ubuntu 再次查看內(nèi)存使用情況:

free -m

發(fā)現(xiàn)交換空間存在。

3.3 編譯源碼

3.3.1 初始化環(huán)境

cd進(jìn)入AOSP的目錄,依次輸入如下2個(gè)命令:

source build/envsetup.sh
// 編譯前刪除build文件夾A
make clobber
3.3.2 選擇編譯目標(biāo)

輸入命令:

lunch
企業(yè)微信截圖_16557041282029.png

lunch命令用來(lái)讓用戶(hù)選擇編譯目標(biāo),只有在source build/envsetup.sh之后才會(huì)有效,不然會(huì)報(bào)命令not found
這里我又踩了一個(gè)坑,參照其他人的比較老的教程選擇了aosp_x86-eng,這是可以運(yùn)行在模擬器上。
Which would you like? [aosp_arm-eng]后面直接輸入對(duì)應(yīng)序號(hào)39就可以。
此序號(hào)39不是固定,不同版本源碼列表不一樣。

也可以使用命令lunch aosp_x86-eng直接指定編譯的目標(biāo)(不用每次都列出一個(gè)表然后輸入39
然而我最終編譯成功之后無(wú)法在模擬器上運(yùn)行,因?yàn)?strong>android12源碼改了!奶奶的,使用aosp_x86-eng編譯并不能在模擬器上運(yùn)行,無(wú)法啟動(dòng)的原因是沒(méi)有生成相關(guān)*-qemu.img, 提示:Could not open '****/userdata-qemo.img':No such file or directory
尋找一番解決方案,使用以下方式編譯:

lunch sdk_phone_x86_64

細(xì)心的朋友可能發(fā)現(xiàn)了“sdk_phone_x86_64”并沒(méi)有出現(xiàn)在上面的lunch列表里,但實(shí)際上是存在的:


15.png
3.3.3 開(kāi)始編譯

如果你在Ubuntu安裝時(shí)分配的內(nèi)存就大于16G,那么直接執(zhí)行下面的編譯命令,如果你害怕編譯失敗浪費(fèi)時(shí)間,那么直接按3.3.4把所有的解決方案操作一遍,再運(yùn)行編譯命令:

make -j6

這里的6是指并行任務(wù)數(shù),我給虛擬機(jī)分配了6核,所以我用了參數(shù)6,理論上是可以設(shè)置到最大值12(6核12線(xiàn)程),以提高編譯速度,開(kāi)始編譯后會(huì)提示需要16G左右的內(nèi)存,如果編譯失敗,請(qǐng)減少-j的參數(shù),我實(shí)測(cè)減少-j參數(shù)并沒(méi)有用,唯一有用的就是增大內(nèi)存.


image.png

如果一切順利,編譯成功會(huì)這樣:


image.png

日啊,編譯了7個(gè)多小時(shí),我的電腦太垃圾了啊。終于成功了!前前后后花了10幾天終于成功!

但是很可能會(huì)失敗報(bào)錯(cuò):

3.3.4 解決OOM內(nèi)存不足的問(wèn)題

明明已經(jīng)創(chuàng)建了虛擬內(nèi)存,為什么還會(huì)報(bào)OOM錯(cuò)誤?

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
ninja failed with: exit status 1

我搜索了一些資料發(fā)現(xiàn)很多人都有這個(gè)問(wèn)題,說(shuō)是編譯的時(shí)候這個(gè)虛擬內(nèi)存根本就沒(méi)有被利用到,我暈!

新建一個(gè)終端,輸入命令:

top
7.png

上面那行KiB Mem是物理內(nèi)存,下面那行KiB Swap就是我們的虛擬內(nèi)存(交換空間),通過(guò)這個(gè)界面我們可以監(jiān)測(cè)swap用上了沒(méi)有。

我再次執(zhí)行編譯命令,然后報(bào)OOM錯(cuò)誤,通過(guò)top信息查看到這個(gè)虛擬內(nèi)存確實(shí)幾乎沒(méi)有被利用。
那么接下來(lái)進(jìn)行一些設(shè)置,讓虛擬內(nèi)存能夠被利用:

方法來(lái)自:(Ubuntu解決swap分區(qū)未被使用的問(wèn)題)
終端輸入命令:

sudo vim /etc/sysctl.conf

在最后面添加如下語(yǔ)句(按i進(jìn)入編輯模式,光標(biāo)移到最后,插入語(yǔ)句)

vm.min_free_kbytes=1500000 

保存退出(按ESC退出編輯模式,輸入:wq保存退出)

然后重啟開(kāi)機(jī)
原鏈接是這么寫(xiě)的:

更改swap配置,讓系統(tǒng)RAM還有250000kbyte(可根據(jù)自己電腦的RAM自定義,系統(tǒng)的默認(rèn)值很小,導(dǎo)致已經(jīng)卡死了才會(huì)啟動(dòng)swap,我是8G內(nèi)存所以設(shè)置250000)

原鏈接是4個(gè)0,可用內(nèi)存不足250M時(shí)啟用swap,我直接加了個(gè)0,我分配給Ubuntu的內(nèi)存為8G,這樣不足1.5G的時(shí)候就啟用swap,我覺(jué)得這樣更保險(xiǎn)。如果你給Ubuntu分配的內(nèi)存為4G,我建議你不要設(shè)置1.5G,這樣可能會(huì)影響到系統(tǒng)正常運(yùn)行,因?yàn)樘摂M內(nèi)存效率沒(méi)有物理內(nèi)存高的,所以你系統(tǒng)可能很頻繁的啟用swap可能會(huì)卡,設(shè)置1G試一下。

重啟后再次編譯,有效果!

17.png

top信息可以看到swap空間利用起來(lái)了,你以為就這么結(jié)束了?
后面又奔潰了,還是OOM錯(cuò)誤,不過(guò)又多了一行錯(cuò)誤信息:

ninja: build stopped: subcommand failed.

找到一個(gè)解決辦法:https://forum.xda-developers.com/t/guide-how-to-build-android-11-with-low-ram.4298483

image.png

找到 aosp_12/build/soong/java/droidstubs.go 文件,雙擊打開(kāi),搜索“cmd.BuiltTool("metalava")”定位到代碼處,然后新加語(yǔ)句:

Flag("-J-Xmx6114m").
image.png

保存退出

然后再次編譯!一直等一直等,成功了!

image.png

3.3.5 模擬器運(yùn)行

模擬器運(yùn)行可能會(huì)出現(xiàn)問(wèn)題:
問(wèn)題1:ERROR: x86_64 emulation currently requires hardware acceleration
模擬器需要硬件加速,我使用的虛擬機(jī)是VMware workstation
解決參考:https://blog.csdn.net/mvp_Dawn/article/details/107678057
問(wèn)題2:打開(kāi)硬件加速后,Ubuntu無(wú)法啟動(dòng)提示:
此平臺(tái)不支持虛擬化的 Intel VT-x/EPT。 不使用虛擬化的 Intel VT-x/EPT,是否繼續(xù)?
VMware Workstation 在此主機(jī)上不支持嵌套虛擬化。 模塊“HV”啟動(dòng)失敗。 未能啟啟動(dòng)虛擬機(jī)

我按照這個(gè)解決了:https://blog.csdn.net/m0_62571257/article/details/124102636

其他一些問(wèn)題記錄:

make clobber
它會(huì)刪除所有設(shè)置所生成的所有的output與中間文件。
等價(jià)于指令
rm -rf out/
如果遇到make clobber一直卡住的,可以試試rm這個(gè)命令

感謝:
http://liuwangshu.cn/framework/aosp/1-install-ubuntu.html
http://liuwangshu.cn/framework/aosp/2-download-aosp.html
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
https://forum.xda-developers.com/t/guide-how-to-build-android-11-with-low-ram.4298483/
https://blog.csdn.net/SSchawn/article/details/116138896

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

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

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