本教程让您可以首次尝试 Android 操作系统开发。
Android 开发环境设置
在下载并构建 Android 源代码的 main
分支之前,请确保您的硬件满足必要的要求,并且已正确安装所需的软件。您还应熟悉以下术语
- Git
- Git 是一个免费的开源分布式版本控制系统。Android 使用 Git 进行本地操作,例如分支、提交、差异和修改。如需了解有关 Git 的帮助,请参阅Git 文档。
- Repo
- Repo 是 Git 的 Python 封装容器,可简化跨多个 Git 代码库执行复杂操作的过程。Repo 不会取代 Git 的所有版本控制操作,它只是让复杂的 Git 操作更容易完成。Repo 使用清单文件将 Git 项目聚合到 Android 超级项目中。
- 清单文件
- 清单文件是一个 XML 文件,用于指定 Android 源代码中的各种 Git 项目在 AOSP 源代码树中的位置。
满足硬件要求
您的开发工作站应满足或超过以下硬件要求
64 位 x86 系统。
至少 400 GB 的可用磁盘空间用于检出和构建代码(250 GB 用于检出 + 150 GB 用于构建)。
至少 64 GB 的 RAM。Google 使用配备 64 GB RAM 的 72 核计算机来构建 Android。使用此硬件配置,完整构建 Android 大约需要 40 分钟,而增量构建 Android 仅需几分钟。相比之下,使用配备 64 GB RAM 的 6 核计算机进行完整构建大约需要 6 小时。
满足操作系统要求
您的开发工作站必须运行任何 64 位 Linux 发行版,且该发行版带有 GNU C Library (glibc) 2.17 或更高版本。
安装必需的软件包
要为 Ubuntu 18.04 或更高版本安装必需的软件包,请运行以下命令
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
安装必需的软件
在您开始使用 AOSP 之前,您必须安装 OpenJDK、Make、Python 3 和 Repo。Android 的 AOSP main 分支附带了 OpenJDK、Make 和 Python 3 的预构建版本,因此无需执行其他安装步骤。以下部分介绍了如何安装 Repo。
安装 Repo
按照以下步骤安装 Repo
下载当前软件包信息
sudo apt-get update
运行以下命令以安装 Repo 启动器
sudo apt-get install repo
Repo 启动器提供了一个 Python 脚本,用于初始化检出并下载完整的 Repo 工具。
如果成功,请跳到第 4 步。
(可选)使用以下一系列命令手动安装 Repo
export REPO=$(mktemp /tmp/repo.XXXXXXXXX) curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65 curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo
前三个命令设置一个临时文件,将 Repo 下载到该文件,并验证提供的密钥是否与所需密钥匹配。如果这些命令成功,则最后一个命令会安装 Repo 启动器。
验证 Repo 启动器版本
repo version
输出应指示 2.4 或更高版本,例如
repo launcher version 2.45
下载 Android 源代码
Android 源代码位于 Google 托管的 Git 代码库集合中。每个 Git 代码库都包含 Android 源代码的完整历史记录,包括对源代码的更改以及进行更改的时间。要下载 Android 源代码
导航到您的主目录
cd ~
在其中创建一个本地工作子目录
mkdir aosp
导航到该目录
cd aosp
初始化 AOSP 代码库源代码 main 分支(默认分支)
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
输入或接受您的 Git 凭据(姓名、电子邮件地址)。
同步源代码
repo sync -c -j8
如果您在下载过程中遇到任何问题,请参阅排查并修复同步问题。
构建代码
要构建代码
在您的工作目录中,执行
envsetup.sh
脚本以设置您的构建环境source build/envsetup.sh
使用
lunch
命令指定要构建的目标设备类型。目标是设备排列组合,例如特定型号或外形规格。指定此目标lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
您应该会看到您的目标和构建环境的概要
============================================ PLATFORM_VERSION_CODENAME=VanillaIceCream PLATFORM_VERSION=VanillaIceCream PRODUCT_INCLUDE_TAGS=com.android.mainline TARGET_PRODUCT=aosp_arm TARGET_BUILD_VARIANT=eng TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=generic HOST_OS=linux HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete HOST_CROSS_OS=windows BUILD_ID=AOSP.MAIN OUT_DIR=out ============================================
构建目标
m
预计首次构建将花费数小时。后续构建花费的时间会大大减少。您的构建输出显示在 $OUT_DIR
中。
启动 Cuttlefish
Cuttlefish 是用于测试您的 build 的 Android 模拟器。
运行以下命令以下载、构建和安装主机 Debian 软件包
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish
for dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd done
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
sudo usermod -aG kvm,cvdnetwork,render $USER
sudo reboot
重新启动会触发安装其他内核模块并应用
udev
规则。启动 Cuttlefish
launch_cvd --daemon
通过在您的 Web 浏览器中导航到
https://127.0.0.1:8443
,连接到 Cuttlefish 设备。您的虚拟 Android 设备随即会显示出来。
进行更改
按照此变更列表示例更新源代码。
在您的检出根目录(
aosp/
目录)中,导航到frameworks/native
Git 项目cd frameworks/native
使用以下命令启动临时项目
repo start <some-name> .
使用您的编辑器编辑以下位置的
SurfaceFlinger.cpp
aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
找到这行代码
void SurfaceFlinger::updateColorMatrixLocked() {
在
updateColorMatrixLocked()
的开头添加这行代码mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f}, vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
构建代码
m
更新设备上的 build
adb root
adb remount -R
adb root
adb sync
adb reboot
验证您是否在您选择的设备上看到了颜色变化,这与图 1 中显示的内容类似。
图 1. 成功更改颜色后的屏幕外观
修复测试
本部分代码实验室使用源代码树中一个失败的示例测试。
要运行、调试和修复测试,请按照以下说明操作
运行
atest DevCodelabTest
测试失败。
检查失败测试的堆栈轨迹
STACKTRACE: java.lang.AssertionError at org.junit.Assert.fail(Assert.java:87) at org.junit.Assert.assertTrue(Assert.java:42) at org.junit.Assert.assertTrue(Assert.java:53) at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)
堆栈轨迹的最后一行显示了失败的测试 (
testHelloWorld
)。此测试位于名为DevCodelabTest.java
的文件中。要确定要修复的测试的位置,请将
WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/
附加到堆栈轨迹的最后一行,直到并包括测试文件的名称。因此,android.test.example.devcodelab.DevCodelabTest
变为WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
。编辑
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
,并将Assert.assertTrue(false)
替换为Assert.assertTrue(true)
再次运行测试以验证您是否修复了问题
atest DevCodelabTest
上传您的代码以供审核
Repo 通过捆绑 git clone
等命令简化了 Git 的使用,以便一次处理多个 Git 代码库(或项目)。
对于 Git 中项目的代码审核,请使用基于 Web 的代码审核系统Gerrit。
假设您在
frameworks/native
项目中进行了更改,请运行以下命令以上传您的更改cd frameworks/native
repo start codelab .
git add .
git commit
对于您的提交消息,请输入以下内容
Android codelab change Test: manual atest
上传您的更改
repo upload
如果成功,您会看到类似于以下内容的消息
Upload project frameworks/native/ to remote branch main: branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700): ff46b36d android codelab change to https://android-review.googlesource.com/ (y/N)? y remote: Processing changes: refs: 1, new: 1, done remote: remote: SUCCESS remote: remote: https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android codelab change [NEW] remote: To https://android-review.googlesource.com/platform/frameworks/native * [new branch] codelab -> refs/for/main
在 Gerrit 中查看您的更改
要在 Gerrit 中查看您的更改,请导航到终端中输出的链接。该链接类似于以下内容
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
恢复您的更改
通常,在测试后以及经过审核和批准后,您会在 Gerrit 中提交您的更改并将其合并到代码库中。但是,为了本代码实验室的目的,请恢复您的工作
在 Gerrit 中,点击 Abandon(放弃)。
放弃
frameworks/native
项目目录(或其子目录)中关联的临时分支repo abandon codelab .
恢复您对测试文件所做的更改。由于您没有对测试更改运行
repo start
、git commit
和repo upload
,因此您可以重置文件本身。假设您位于aosp/platform_testing directory
中,请使用以下命令重置文件git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
git checkout .
这完成了 Android 平台开发的代码实验室。
获取帮助
如果您在本代码实验室中遇到错误,请使用任何页面底部的问题跟踪器链接报告这些错误。如有疑问,请发送至android-building 群组。
输入 ps -A | grep crosvm
以查看 crosvm
是否已在运行。如果 crossvm
正在运行,请输入 stop_cvd || true
或使用进程 PID kill crosvm
进程。