Android 源码 (AOSP) 下载与编译

3,587 阅读5分钟

准备工作

在下载 Android 开放源代码项目(Android Open Source Project,简称 AOSP )时,需要进行如下的准备工作:

  1. 安装 Python 3;
  2. 安装 Git;
  3. 安装 Repo。

为了方便后续编译代码,建议所有的操作需要在 Linux 中完成。

安装 Python 3

  1. 更新系统软件包库;
sudo apt update
  1. 安装 Python 3;
sudo apt-get install python3
  1. 检查是否安装成功。
python --version

要是能够成功显示 Python 的版本号,说明已经安装成功。否则就要回头检查一下,到底是哪个步骤没有成功。

注意:如果你的系统是 Ubuntu 20.04.2 LTS 及其以上安装 Python 3 可能会报 /usr/bin/env: ‘python’: No such file or directory 异常,解决办法是需要创建一个符号链接。1)whereis python3,找到 python3 的位置;2)sudo ln -s /usr/bin/python3 /usr/bin/python,创建符号链接。

安装 Git

  1. 下载和安装 Git;
sudo apt-get install git
  1. 配置环境变量;
mkdir ~/bin
PATH=~/bin:$PATH
  1. 检查是否安装成功;
git --version
  1. 配置用户信息。
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

例如,姓名 张三 的邮件是 zhangsan@example 的话,配置就是:

git config --global user.email "zhgangsan@example.com"
git config --global user.name "San Zhang"

安装 Repo

  1. 下载 Repo;
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo

报错 Command 'curl' not found, but can be installed with:,解决办法是先安装 curl,命令 sudo apt-get install curl。

  1. 权限设置;
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
  1. 检查是否安装成功。
repo --version

下载 AOSP

确保下载前的准备工作都已经完成后,就可以开始下载 AOSP 了。要是可以访问国外的网络环境,下载 AOSP 的方法可以直接参考 官网方法 。要是在国内的话,可以使用 清华大学开源软件镜像站

初始化仓库

  1. 先新建一个存放 AOSP 的代码仓库;
mkdir android
cd android
  1. 选择 AOSP 版本;

因为 Android 有很多版本的代码,官网 提供了所有 Android 版本的代码分支,先确认自己所需要的 Android 版本分支。

  1. 初始化仓库;

在第 2 步中,选择需要的代码分支,假如需要的是 android-13.0.0_r24 分支的代码,那么初始化仓库的命令就是:

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

这一步可能会报如下错误:

fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle;
fatal: error [Errno 101] Network is unreachable 

解决方法是在 ~/.bashrc 文件中添加一个路径,步骤如下:

  1. 初始化成功。

执行完初始化命令后,成功的话,控制台会返回:

repo has been initialized in /home/user/android/android

同步全部代码

最后,只需要一条命令就可以同步 Android 源码树:

repo sync

等待下载完成,大概需要花费 4 ~ 5 小时(具体要看当时的网络情况)。

同步单仓库代码

全部同步到本地代码最大的好处就是可以在本地编译 Android 源码。但是,有时候我们不需要编译源码,比如当你只想看某个仓库的代码的时候,那么上述的命令就显得很冗余。此时,可以按照如下的步骤单独下载某个仓库的源码:

  • Step 1:在你执行 repo init 的路径下,执行 ls -a 找到隐藏文件夹 .repo ,然后查看 manifest.xml 的文件。
ls -a
cat ./repo/manifest.xml

只有在 repo init 执行成功的情况下,才可以找到 manifest.xml 文件。

有的公司会直接把仓库信息显示在 manifest.xml 文件中,但是更多时候我们看到的 manifest.xml 信息是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!--
DO NOT EDIT THIS FILE!  It is generated by repo and changes will be discarded.
If you want to use a different manifest, use `repo init -m <file>` instead.

If you want to customize your checkout by overriding manifest settings, use
the local_manifests/ directory instead.

For more information on repo manifests, check out:
https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
-->
<manifest>
  <include name="default.xml" />
</manifest>

这时候就需要找到 default.xml 查看里面的内容。

cd ./.repo/manifests
cat default.xml

你可以看到每一个仓库的信息:

 <!-- BEGIN open-source projects -->
  <project path="build/make" name="platform/build" groups="pdk" >
    <linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />
    <linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" />
    <linkfile src="core" dest="build/core" />
    <linkfile src="envsetup.sh" dest="build/envsetup.sh" />
    <linkfile src="target" dest="build/target" />
    <linkfile src="tools" dest="build/tools" />
  </project>
  <project path="build/bazel" name="platform/build/bazel" groups="pdk" >
    <linkfile src="bazel.WORKSPACE" dest="WORKSPACE" />
    <linkfile src="bazel.sh" dest="tools/bazel" />
    <linkfile src="bazel.BUILD" dest="BUILD" />
  </project>
  <project path="build/bazel_common_rules" name="platform/build/bazel_common_rules" groups="pdk" />
  <project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />
  <project path="build/pesto" name="platform/build/pesto" groups="pdk" />
  <project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" >

从 defalut.xml 中找到需要的仓库信息。比如,需要的是 Permission 这个仓库:

cat default.xml | grep Permission

Permission 仓库的信息:

<project path="packages/modules/Permission" name="platform/packages/modules/Permission" groups="pdk-cw-fs,pdk-fs" />
  • Step 2:同步单个仓库代码,以 Permission 仓库为例。
repo sync -c packages/modules/Permission

最后,就可以在本地查看到想要仓库的代码了。

编译 AOSP

source build/envsetup.sh
lunch

然后,选择一个想要编译的工程,比如 aosp_raven_car-userdebug 。

在编译的时候,有的主机上会出现 prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No 15:44:33 ninja failed with: exit status 1 错误,此时解决办法是:

  1. 32-bit 机器:sudo apt-get install libncurses5:i386
  2. 64-bit 机器:sudo apt-get install libncurses5

要是安装时间太久,可以将源更换成国内源,建议使用 清华源

假如你手上正好有 Pixel 手机的话,可以根据官网提供的 Pixel 设备工程对照表 进行编译。

Android 代码检索

谷歌提供了在线的 AOSP 代码检索网站,可以在不下载 AOSP 的情况下直接检索每个版本的代码:

国内访问速度较慢甚至无法访问。

原生刷机

原生机器指的是谷歌旗下的 Nexus 和 Pixel 终端设备,谷歌提供了相关的刷机工具:

国内访问速度较慢甚至无法访问。

解锁 Bootloader

在刷机前,需要先解锁 Bootloader 和 OEM。步骤如下:

  1. 配置 fastboot 环境;
  2. 连接网络登录谷歌账号;
  3. 开启 OEM unlocking 和 USB 调式;
  4. 执行刷机命令。

对于 连接网络登录谷歌账号 不在赘述,可从设置中登录。

配置 fastboot 环境

先检查环境是否可用;

fastboot devices

假如出现 'fastboot' is not recognized ... 的提示信息,可以检测一下 adb devices 是否可用。通常,只要配置了 adb 环境变量就可以使用 fastboot 命令。否则,需要配置 fastboot 环境变量。

若配置环境变量后,还无法使用 fastboot 命令的话,可以看看是否需要安装相关驱动。具体步骤可以参见 这篇文档

开启 OEM unlocking 和 USB 调式

  1. 开启 OEM unlocking; Settings -> About Phone -> Tap on Build Number several times -> Go back to Settings -> System -> Developer Options -> enable OEM unlocking
  2. 打开 USB 调试; Settings -> About Phone -> Tap on Build Number several times -> Go back to Settings -> System -> Developer Options -> USB Debugging

执行刷机命令

一切配置完成后,就可以开始执行刷机命令了:

adb reboot bootloader
fastboot flashing unlock
fastboot reboot

推荐 AOSP 源

  1. 清华大学开源软件镜像站
  2. 中科大开源镜像站

这些都是比较稳定和可靠的 AOSP 源,并且文档也很规范。