准备工作
在下载 Android 开放源代码项目(Android Open Source Project,简称 AOSP )时,需要进行如下的准备工作:
- 安装 Python 3;
- 安装 Git;
- 安装 Repo。
为了方便后续编译代码,建议所有的操作需要在 Linux 中完成。
安装 Python 3
- 更新系统软件包库;
sudo apt update
- 安装 Python 3;
sudo apt-get install python3
- 检查是否安装成功。
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
- 下载和安装 Git;
sudo apt-get install git
- 配置环境变量;
mkdir ~/bin
PATH=~/bin:$PATH
- 检查是否安装成功;
git --version
- 配置用户信息。
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
- 下载 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。
- 权限设置;
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
- 检查是否安装成功。
repo --version
下载 AOSP
确保下载前的准备工作都已经完成后,就可以开始下载 AOSP 了。要是可以访问国外的网络环境,下载 AOSP 的方法可以直接参考 官网方法 。要是在国内的话,可以使用 清华大学开源软件镜像站 。
初始化仓库
- 先新建一个存放 AOSP 的代码仓库;
mkdir android
cd android
- 选择 AOSP 版本;
因为 Android 有很多版本的代码,官网 提供了所有 Android 版本的代码分支,先确认自己所需要的 Android 版本分支。
- 初始化仓库;
在第 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 文件中添加一个路径,步骤如下:
- vim ~/.bashrc;
- 在最后添加 export REPO_URL='mirrors.tuna.tsinghua.edu.cn/git/git-rep…
- 保存退出。
- 初始化成功。
执行完初始化命令后,成功的话,控制台会返回:
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
错误,此时解决办法是:
- 32-bit 机器:
sudo apt-get install libncurses5:i386
- 64-bit 机器:
sudo apt-get install libncurses5
要是安装时间太久,可以将源更换成国内源,建议使用 清华源。
假如你手上正好有 Pixel 手机的话,可以根据官网提供的 Pixel 设备工程对照表 进行编译。
Android 代码检索
谷歌提供了在线的 AOSP 代码检索网站,可以在不下载 AOSP 的情况下直接检索每个版本的代码:
国内访问速度较慢甚至无法访问。
原生刷机
原生机器指的是谷歌旗下的 Nexus 和 Pixel 终端设备,谷歌提供了相关的刷机工具:
国内访问速度较慢甚至无法访问。
解锁 Bootloader
在刷机前,需要先解锁 Bootloader 和 OEM。步骤如下:
- 配置 fastboot 环境;
- 连接网络登录谷歌账号;
- 开启 OEM unlocking 和 USB 调式;
- 执行刷机命令。
对于 连接网络登录谷歌账号 不在赘述,可从设置中登录。
配置 fastboot 环境
先检查环境是否可用;
fastboot devices
假如出现 'fastboot' is not recognized ... 的提示信息,可以检测一下 adb devices 是否可用。通常,只要配置了 adb 环境变量就可以使用 fastboot 命令。否则,需要配置 fastboot 环境变量。
若配置环境变量后,还无法使用 fastboot 命令的话,可以看看是否需要安装相关驱动。具体步骤可以参见 这篇文档。
开启 OEM unlocking 和 USB 调式
- 开启 OEM unlocking; Settings -> About Phone -> Tap on Build Number several times -> Go back to Settings -> System -> Developer Options -> enable OEM unlocking
- 打开 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 源
- 清华大学开源软件镜像站
- 中科大开源镜像站
这些都是比较稳定和可靠的 AOSP 源,并且文档也很规范。