AOSP 編譯Android12源碼全記錄

編譯源碼基本上都是在linux環境下編譯,所以我們在window系統中使用虛擬機安裝ubuntu系統來編譯

1.虛擬機安裝 Ubuntu

首先是下載Ubuntu系統鏡像,我一開始下載的ubuntu官網上最新版Ubuntu 22.04 LTS,后來repo同步 android12源碼的時候始終失敗,但同步 android9源碼會成功,后來換了Ubuntu18.04 LTS,終于repo同步成功。
簡單說下載Ubuntu18.04 LTS版本,切記切記Ubuntu官網下載
拉到最下面就是:

企業微信截圖_1655184658939.png

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

安裝Ubuntu前提一嘴:

1.如果你的電腦內存足夠大,比如32G,那么在按照下面的安裝步驟進行到給Ubuntu分配內存的時候,直接分配20G以上,會讓你少走很多彎路。我的電腦總共16G,Ubuntu分配了8G。
2.給Ubuntu分配磁盤空間的時候至少分配200G,因為源碼下載下來很大
3.安裝Ubuntu過程中遇到安裝界面被遮擋點不了“下一步”按鈕,嘗試按住win鍵然后鼠標拖動界面

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

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

2.下載AOSP源碼

AOSP(Android Open Source Project)是Google開放的Android 開源項目,中文官網為:https://source.android.google.cn/
AOSP通俗來講就是一個Android系統源碼項目,通過它可以定制 Android 操作系統,國內手機廠商都是在此基礎上開發的定制系統。因為墻的緣故,如果無法連接谷歌服務器獲取AOSP源碼,可以從 清華大學鏡像站或者 中科大鏡像。本篇文章以清華大學鏡像站為例。

2.1下載 repo工具

Android源碼包含數百個git庫,光是下載這么多的git庫就是一項繁重的任務,所以Google開發了repo,它是用于管理Android版本庫的一個工具,使用了Python對git進行了一定的封裝,簡化了對多個Git版本庫的管理。

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

sudo apt-get install git

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

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

創建bin,并加入到PATH中:

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

安裝curl庫:

sudo apt-get install curl

下載repo并設置權限:

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

安裝python,repo初始化時會用到:

sudo apt-get install python

2.2下載源碼

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

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

這個方式對磁盤空間要求較大,初始化包是個壓縮包大概在190G左右,然后還得解壓,所以磁盤要求起碼400G起步,如果你在之前安裝Ubuntu的時候分配的空間不足400G要么進行擴容,要么使用2.2.2傳統初始化方法。

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

首先我們先下載這個aosp-latest.tar,這個包接近200G因為它包含了所有版本信息!如果覺得太大,請看2.2.2傳統方法。
可以在ubuntu使用終端命令下載,也可以在windows里使用迅雷等工具下載然后再通過共享文件夾復制到ubuntu里,然后解壓 ,然后把代碼checkout出來 checkout參考清華源AOSP,在ubuntu里下載也參考清華源AOSP

2.2.2 傳統初始化方法

建立工作目錄 :

mkdir aosp_12
cd aosp_12

repo的運行過程中會嘗試訪問官方的git源更新repo自己,如果想使用tuna的鏡像源進行更新,可以將如下內容復制到你的~/.bashrc里

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

找不到.bashrc文件?
打開Ubuntu桌面的文件 ,如圖:


image.png

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


6.png

初始化倉庫:

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

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


4.png

2.3下載內核源碼

AOSP源碼中并不包括內核源碼,需要單獨下載,內核源碼有很多版本,比如common是通用的Linux內核,msm是用于使用高通MSM芯片的Android設備,goldfish是用于Android模擬器的內核源碼,這里以goldfish為例。

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

mkdir kernel
cd kernel

使用清華的鏡像:

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

完成后kernel目錄中會生成一個goldfish文件夾,進入goldfish目錄并使用git命令

cd goldfish
git branch -a

這時會列出有哪些內核的版本分支可以下載


MEYoHH.png

這里選擇下載goldfish 3.4版本

git checkout remotes/origin/android-goldfish-3.4

3.開始編譯源碼

3.1準備編譯環境

安裝 jdk8

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

安裝依賴包

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

設置Ubuntu處理器數量

Ubuntu關機,在VirtualBox主頁進入Ubuntu右側設置–>系統–>處理器選項,設置處理器數量,設置最大處理器數量的一半或更高,也不要設置最大,容易卡主,我設置了一半。

3.2給Ubuntu增加虛擬內存

為什么要增加虛擬內存?編譯Android12源碼的時候提示如下:

image.png

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

Linux 的交換分區(swap),或者叫內存置換空間(swap space),是磁盤上的一塊區域,可以是一個分區,也可以是一個文件,或者是他們的組合。交換分區的作用是,當系統物理內存吃緊時,Linux 會將內存中不常訪問的數據保存到 swap 上,這樣系統就有更多的物理內存為各個進程服務,而當系統需要訪問 swap 上存儲的內容時,再將 swap 上的數據加載到內存中,也就是常說的 swap out 和 swap in。

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

free -m

我們安裝的Ubuntu默認有2G大小的swap空間,如圖


企業微信截圖_16553488731383.png

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

swapon -s
企業微信截圖_16553494615497.png

可以看到我們Ubuntu上的默認的swap是存放在根目錄的swapfile文件,我們去根目錄找一下看看,進入根目錄方法:

打開ubuntu桌面“文件”->點擊其他位置->點擊計算機 即可查看到

我們可以看到swapfile文件,2.1G沒有錯
企業微信截圖_1655349219681.png
3.2.1 已存在swap交換空間

如果swap空間超過16G,則跳到3.3步驟;
如果swap空間沒有16G,那么我們給它擴容,默認只有2G,那么我們給它擴容(其實就是停用刪除這個小的,然后重新創建啟用一個大的)

停用交換文件:

sudo swapoff /swapfile

刪除文件:

sudo rm /swapfile

刪除后繼續創建↓

3.2.2 創建swap交換空間

新建swap空間,以16G為例,創建文件:

sudo fallocate -l 16G /swapfile 

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

ls -lh  /swapfile
企業微信截圖_16553504819787.png

設置文件權限:

sudo chmod 600 /swapfile

再次查看文件信息,權限已改變:


1.png

掛載:

sudo mkswap /swapfile

激活啟用:

sudo swapon /swapfile

再次查看內存使用情況:

free -m
2.png

發現交換空間 16G,然后還有重要的一步把交換信息寫入系統配置,不然Ubuntu重啟后以上配置swap空間工作得重新做

使用vim編輯器打開配置文件:

sudo vim /etc/fstab

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

sudo apt-get install vim

打開配置文件如下:


3.png

發現已經存在/swapfile 這條信息,并且你后來創建的16G的文件使用的名字依然是“swapfile ”,那么我們直接退出編輯器,不用修改
如果你起的是別的名字,那么需要進行配置。

最后一行插入(vim打開后按i進入編輯模式,移動光標到最后回車換行):

/swapfile  swap  swap  defaults  0  0

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

重啟Ubuntu 再次查看內存使用情況:

free -m

發現交換空間存在。

3.3 編譯源碼

3.3.1 初始化環境

cd進入AOSP的目錄,依次輸入如下2個命令:

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

輸入命令:

lunch
企業微信截圖_16557041282029.png

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

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

lunch sdk_phone_x86_64

細心的朋友可能發現了“sdk_phone_x86_64”并沒有出現在上面的lunch列表里,但實際上是存在的:


15.png
3.3.3 開始編譯

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

make -j6

這里的6是指并行任務數,我給虛擬機分配了6核,所以我用了參數6,理論上是可以設置到最大值12(6核12線程),以提高編譯速度,開始編譯后會提示需要16G左右的內存,如果編譯失敗,請減少-j的參數,我實測減少-j參數并沒有用,唯一有用的就是增大內存.


image.png

如果一切順利,編譯成功會這樣:


image.png

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

但是很可能會失敗報錯:

3.3.4 解決OOM內存不足的問題

明明已經創建了虛擬內存,為什么還會報OOM錯誤?

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

我搜索了一些資料發現很多人都有這個問題,說是編譯的時候這個虛擬內存根本就沒有被利用到,我暈!

新建一個終端,輸入命令:

top
7.png

上面那行KiB Mem是物理內存,下面那行KiB Swap就是我們的虛擬內存(交換空間),通過這個界面我們可以監測swap用上了沒有。

我再次執行編譯命令,然后報OOM錯誤,通過top信息查看到這個虛擬內存確實幾乎沒有被利用。
那么接下來進行一些設置,讓虛擬內存能夠被利用:

方法來自:(Ubuntu解決swap分區未被使用的問題)
終端輸入命令:

sudo vim /etc/sysctl.conf

在最后面添加如下語句(按i進入編輯模式,光標移到最后,插入語句)

vm.min_free_kbytes=1500000 

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

然后重啟開機
原鏈接是這么寫的:

更改swap配置,讓系統RAM還有250000kbyte(可根據自己電腦的RAM自定義,系統的默認值很小,導致已經卡死了才會啟動swap,我是8G內存所以設置250000)

原鏈接是4個0,可用內存不足250M時啟用swap,我直接加了個0,我分配給Ubuntu的內存為8G,這樣不足1.5G的時候就啟用swap,我覺得這樣更保險。如果你給Ubuntu分配的內存為4G,我建議你不要設置1.5G,這樣可能會影響到系統正常運行,因為虛擬內存效率沒有物理內存高的,所以你系統可能很頻繁的啟用swap可能會卡,設置1G試一下。

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

17.png

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

ninja: build stopped: subcommand failed.

找到一個解決辦法: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 文件,雙擊打開,搜索“cmd.BuiltTool("metalava")”定位到代碼處,然后新加語句:

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

保存退出

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

image.png

3.3.5 模擬器運行

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

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

其他一些問題記錄:

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

感謝:
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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容