Ubuntu 22.04上编译Android 13 AOSP系统

发布时间 2023-08-24 15:51:20作者: suntl

背景

因为最近空闲期,刚好遇到了一个小项目,需要AOSP系统的,因此就花费了一些时间捣鼓了一下,源码编译aosp13

环境:

vm 22.04
空间350g
内存24g
image

环境配置

以下所有操作需要全球通上网,已经安装git环境。
把Ubuntu源切到国内,下载速度快很多。

sudo apt install unzip zip libssl-dev  libffi-dev gnupg flex bison gperf build-essential  curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev libz-dev ccache libgl1-mesa-dev libxml2-utils xsltproc 

开始下载repo,如果已经有可以跳过。

mkdir ~/bin
vim ~/.bashrc

# 在文件的最后添加下面一行代码,保存退出
PATH=~/bin:$PATH
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
# 生效修改

source ~/.bashrc

下载Android源码

在下载Android源码前,需要安装编译依赖库和工具下载

  1. 安装git
sudo apt-get install git

安装成功后,查看git版本

git --version

image
安装完成后,需要用如下命令进行配置,分别替换为自己的名字和邮箱(不强制真实邮箱)

git config --global user.name YourName
git config --global user.email you@example.com

查看当前git配置:

git config -l

image

  1. 创建Android源码目录:
mkdir ~/android13r35
cd ~/android13r35

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r35

repo sync -j8

  1. 编译
cd ~/android13r35
source build/envsetup.sh
export WITH_DEXPREOPT=false
lunch aosp_x86_64-eng
make -j8

下面选择自己想要的版本,如果想要启动模拟器的话,要选择sdk开头的,比如aosp_car_x86_64-userdebug是无法启动模拟器的,sdk_car_x86_64-userdebug 可以启动模拟器

lunch sdk_car_x86_64-userdebug

source build/envsetup.sh
export WITH_DEXPREOPT=false
lunch sdk_x86_64
make -j8

通过lunch指令设置编译目标,就是生成的镜像要运行在什么样的设备上,我这里是准备在模拟器上跑所以选择31(即aosp_x86_64-eng),模拟器是x86的平台,运行速度会更快。这里也可以用编译目标名称如lunch aosp_x86_64-eng,因为不同版本的编译目标名称序号并不相同。

编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_x86_64-eng的BUILD是aosp_x86_64,BUILDTYPE是eng。BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境。其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构处理器,x86则表示x86架构的处理器。BUILD TYPE则指的是编译类型,通常有三种:

-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不能dedug等)
-userdebug:在user版本的基础上开放了root权限和debug权限。
-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具。
选择完编译目标之后会打印出对应平台的编译参数。

image

这是我虚拟机编译时候的资源占用情况,CPU应该是够用的,使用率一直在100%左右,而内存消耗达到了99% 实体机32G内存,可见AOSP编译对内存要求相当高,而当我们编译到90%进度的时候,会生成大量文件,对硬盘读写速率要求也很高,我这里用固态硬盘,在生成文件时硬盘使用率一直在80%。

image

image

- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
- clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同
其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Setting 模块,执行指令:
mmm packages/apps/Settings/

其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Setting 模块,执行指令:
mmm packages/apps/Settings/

  1. 运行
    在编译完成之后,就可以通过以下命令运行Android模拟器了,命令如下:
source build/envsetup.sh 
lunch(选择刚才你设置的目标版本,比如这里我选择的是31) 
emulator

如果你是在编译完后立刻运行模拟器,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行模拟器:

emulator

遇到的问题

  1. Ubuntu22.04,AOSP编译报错: libncurses.so.5: cannot open shared object file: No such file
    解决:
sudo dpkg --add-architecture i386  
sudo apt-get update
sudo apt-get install libncurses5:i386 
sudo apt-get install libncurses5-dev  libncurses5
  1. 默认情况在linux编译系统 会开启odex的
    解决:编译前关闭dex2oat
export WITH_DEXPREOPT=false

参考

https://it.cha138.com/shida/show-457152.html

https://blog.csdn.net/didayuye/article/details/130462203

https://blog.csdn.net/Doudou_Mylove/article/details/115392736