背景
因为最近空闲期,刚好遇到了一个小项目,需要AOSP系统的,因此就花费了一些时间捣鼓了一下,源码编译aosp13
环境:
vm 22.04
空间350g
内存24g
环境配置
以下所有操作需要全球通上网,已经安装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源码前,需要安装编译依赖库和工具下载
- 安装git
sudo apt-get install git
安装成功后,查看git版本
git --version
安装完成后,需要用如下命令进行配置,分别替换为自己的名字和邮箱(不强制真实邮箱)
git config --global user.name YourName
git config --global user.email [email protected]
查看当前git配置:
git config -l
- 创建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
- 编译
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工具。
选择完编译目标之后会打印出对应平台的编译参数。
这是我虚拟机编译时候的资源占用情况,CPU应该是够用的,使用率一直在100%左右,而内存消耗达到了99% 实体机32G内存,可见AOSP编译对内存要求相当高,而当我们编译到90%进度的时候,会生成大量文件,对硬盘读写速率要求也很高,我这里用固态硬盘,在生成文件时硬盘使用率一直在80%。
- 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/
- 运行
在编译完成之后,就可以通过以下命令运行Android模拟器了,命令如下:
source build/envsetup.sh
lunch(选择刚才你设置的目标版本,比如这里我选择的是31)
emulator
如果你是在编译完后立刻运行模拟器,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行模拟器:
emulator
遇到的问题
- 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
- 默认情况在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
标签:13,git,x86,编译,dev,AOSP,22.04,64,Android From: https://www.cnblogs.com/stlong/p/17645300.html