Ubuntu18 编译 AOSP 步骤

什么是AOSP

AOSP是"Android Open Source Project"的缩写,即"Android开放源代码项目",由谷歌发起,此项目致力于Android的维护和更进一步的发展。

编译前准备

系统信息

本次编译在Windows11下的Ubuntu虚拟机上进行,Ubuntu系统版本如下:

yubo@work-105:~$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

由于AOSP源码巨大(超过100GB),编译非常耗时耗资源,所以这里我给Ubuntu虚拟机设置了200GB的磁盘空间,CPU设置为8核,内存设置为了10G,如果你也采用在Ubuntu虚拟机中编译AOSP的方式,请确保尽可能的将虚拟机的配置调高一些,防止编译中途出现各种问题,这里我就踩了不少坑,出现过几次等待编译几小时,结果在中途报错了。

血泪教训!!!一定要给虚拟机分配足够大的磁盘空间,最起码250GB!!!我已经遇到两次下载源码编译过程中,随着编译产物的不断增多导致磁盘被占满,不仅编译中断,而且虚拟机再次开机后无法启动!!!如果你不想重装系统和重新下载AOSP源码,切记给Ubuntu分配足够大的磁盘空间!!!

如果你的系统是Ubuntu20而不是跟本篇一样的Ubuntu18,按照本篇后续流程可能会出现一些问题,请参考本文最后的问题记录。

安装软件

编译AOSP前你需要安装如下软件:

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 dpkg-dev libsdl1.2-dev libesd0-dev
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 bison

另外,编译前需要安装repo工具,repo是Google开发的用于管理Android版本库的一个工具,可以通过如下方法安装:

  1. 创建bin目录,这一步需要确保当前用户的根目录下存在bin目录,可以用如下命令创建并将bin目录加入环境变量:
mkdir ~/bin
PATH=~/bin:$PATH
  1. 下载repo启动器并确保它可执行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

上面的地址如果无法访问,可以试试清华的源:

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

注意:在Ubuntu中,也可以采用sudu apt-get install repo的方式来安装repo工具,但是我自己尝试这种方式后发现后续可能会出现某些问题,如果直接采用上述的curl来安装,反而没出现问题

  1. 初始化repo

在当前用户的根目录下创建并进入AOSP目录:

mkdir ~/AOSP
cd AOSP

然后配置git用户名和邮箱:

git config --global user.name [Your Name]
git config --global user.email [you@example.com]

然后运行repo init初始化repo,清单文件指定了 Android 源代码中包含的各个代码库位于工作目录中的什么位置,这里我直接运行了下面的命令,指定了分支名:

repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r1

同样你也可以使用清华的源:

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

这里推荐下载编译Android10的源码,因为aosp从Android10开始,有aidegen工具用于将源码导入到Android Studio中方便查看,如果编译的Android版本低于Android10,则源码编译后不会有aidegen工具。

下载AOSP源码

通过下面的命令同步源码(在上面的~/bin/AOSP目录下执行):

repo sync

如果想加快同步源码的速度,可以加入下面的参数:

repo sync -c -j8

-c表示同步当前分支,-j8表示开启8个线程。这里根据你的机器配置,-j参数可以适当调大一些,对于源码的下载有提速作用。但是这个参数不能设置得太大,如果你用的清华的源,-j参数过大,会导致503错误:

由于 AOSP 镜像造成CPU/内存负载过重,我们限制了并发数量,因此建议:
sync的时候并发数不宜太高,否则会出现 503 错误,即-j后面的数字不能太大,建议选择4。
请尽量选择流量较小时错峰同步。
摘录自:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

这一步根据你的网速来决定需要多久,一般是漫长的等待。

命令执行成功后如下图所示:

在这里插入图片描述

编译源码

通过上面几个步骤,已经将源码下载下来,下面开始编译源码:

在源码所在目录执行下面的命令:

source build/envsetup.sh

该命令通过脚本初始化环境。

然后使用下面的命令设置构建目标:

// 这一步请注意,选择构建目标跟下文编译成功启动模拟器时要对应,否则会出错
lunch aosp_arm-eng

然后使用下面的命令开始编译:

make -j6 // 这里的-j参数也可以根据机器配置适当调大一些

接下来就是漫长的等待…

编译成功时可以看到如下图所示的日志输出:
在这里插入图片描述

启动模拟器

启动模拟器使用如下几条命令:

source build/envsetup.sh
lunch  // 这条命令执行会让你选择一个选项,直接回车使用默认的即可
emulator // 这条命令会启动模拟器

然后你就会看到模拟器成功启动了,如下图:
在这里插入图片描述
在这里插入图片描述

大功告成,AOSP编译运行成功!

踩坑问题记录

  1. 执行repo init命令时报错:/usr/bin/env: “python”: 没有那个文件或目录
    如果你的Ubuntu系统是20及以上版本,就可能出现该错误,该错误主要是由于repo命令会调用python,而Ubuntu20上默认的python是python3,修复该问题可以使用如下方法,将python命令默认指向python2即可:

    sudo ln -s /usr/bin/python2 /usr/bin/python
    

    如果要恢复默认的Python3,可以使用下面的命令:

    sudo rm /usr/bin/python
    sudo ln -s /usr/bin/python3 /usr/bin/python
    
  2. 执行make -j6命令时报错:error while loading shared libraries: libtinfo.so.5,修复方法为执行下面的安装命令:

    sudo apt install libncurses5
    
  3. 编译到99%时报错如下:
    解决办法是执行ulimit -c unlimited命令后重新编译

    [ 99% 76895/77386] //frameworks/base/libs/hwui:libhwui link libhwui.so
    Warning: request a ThreadPool with 1 threads, but LLVM_ENABLE_THREADS has been turned off
    ninja: build stopped: subcommand failed.
    01:45:02 ninja failed with: exit status 1
    
  4. 编译中途报错如下:

    repo sync -c -j8
    remote: Enumerating objects: 6, done.
    remote: Counting objects: 100% (6/6), done.
    remote: Compressing objects: 100% (3/3), done.
    remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
    Unpacking objects: 100% (4/4), done.
    Fetching: 100% (733/733), done in 32.045s
    fatal: this operation must be run in a work tree
    error: build/soong/: platform/build/soong checkout c9edd4a0d4099ec65dda987bdd2ac3bc438a5c90 
    error: Cannot checkout platform/build/soong
    fatal: this operation must be run in a work tree
    error: device/google/crosshatch-kernel/: device/google/crosshatch-kernel checkout a9176e1a44948f53e1128f3666e6334d081ffd57 
    error: Cannot checkout device/google/crosshatch-kernel
    fatal: this operation must be run in a work tree
    error: device/generic/common/: device/generic/common checkout d8edd93c1204fe3128248e4715557b09e1864af4 
    error: Cannot checkout device/generic/common
    Checking out: 100% (733/733), done in 41.264s
    
    error: Unable to fully sync the tree.
    error: Checking out local projects failed.
    Failing repos:
    build/soong
    device/generic/common
    device/google/crosshatch-kernel
    Try re-running with "-j1 --fail-fast" to exit at the first error.
    

在这里插入图片描述
这一步需要根据你的实际报错来处理,比如我这里报错最后显示的是:

error: Checking out local projects failed.
Failing repos:
build/soong
device/generic/common
device/google/crosshatch-kernel

那么你需要执行如下命令将目前已经存在的几个目录删掉(如果有就删除):

// 先进入AOSP源码目录下再执行下面的操作
sudo rm -rf .repo/projects/build/soong.git
sudo rm -rf .repo/projects/device/generic/common.git
sudo rm -rf .repo/projects/device/google/crosshatch-kernel.git
sudo rm -rf .repo/project-objects/build/soong.git
sudo rm -rf .repo/project-objects/device/generic/common.git
sudo rm -rf .repo/project-objects/device/google/crosshatch-kernel.git

然后再重新执行repo初始化命令和sync源码:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r1
repo sync -c -j8
  1. 编译中途报错:ninja failed with: exit status 137 查找一番资料后,发现问题的出现主要是由于Ubuntu的swap分区空间不够用导致,修复这个问题的方法为增加Ubuntu的swap分区大小,一般可采用如下一些命令:
// 查看swap分区大小
free -m 或者 sudo swapon --show
// 创建swap文件,分配2G空间
sudo fallocate -l 2G /swapfile
// 如果上面的命令报错:Text file busy,可以先执行swapoff -a,再重新执行上一条命令
// 给swapfile设置权限
sudo chmod 0600 /swapfile
// 使用 mkswap 实用程序在文件上设置 Linux SWAP 区域
sudo mkswap /swapfile
// 激活swap文件
sudo swapon /swapfile
// 以上方式只是临时增大swap分区的空间,要让swap分区永久生效,可以执行如下命令:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  1. 如果你编译的是x86_64的模拟器,可能会遇到下面的问题,需要参考Ubuntu官方文档安装KVM然后重启Ubuntu系统:https://ubuntu.com/blog/kvm-hyphervisor
    在这里插入图片描述

参考

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yubo_725

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值