本教程将引导您首次尝试 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 系统。
注意:您可以在 32 位系统上编译低于 2.3.x 的 AOSP 版本。
如果要检出和构建代码,至少需要 400 GB 可用磁盘空间(250 GB 空间用于检出代码 + 150 GB 空间用于构建代码)。
注意:如果您要检出镜像,则需要更多空间,因为完整的 Android 开源项目 (AOSP) 镜像包含所有使用过的 Git 代码库。
至少 64 GB RAM。Google 使用 72 核机器和 64 GB RAM 来构建 Android。采用此硬件配置时,一个完整的 Android build 大约需要 40 分钟;Android 增量 build 大约需要几分钟的时间。相比之下,使用 6 核机器和 64 GB RAM 构建一个完整 build 大约需要 6 个小时。
满足操作系统要求
开发工作站必须运行采用 GNU C 库 (glibc) 2.17 或更高版本的任何 64 位 Linux 发行版。
安装必需的软件包
如需安装 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
安装必需的软件
您必须先安装 OpenJDK、Make、Python 3 和 Repo,然后才能使用 AOSP。Android 的 AOSP 主分支附带预构建版本的 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 代码库源代码主分支(默认):
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
第一次构建预计需要几个小时。后续构建所需的时间会大大减少。 build 的输出会显示在 $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
在网络浏览器中前往 https://localhost:8443,以连接到 Cuttlefish 设备。系统随即会显示您的搭载 Android 的虚拟设备。
更改
按照以下示例更改列表更新源代码。
从检出分支的根目录(aosp/ 目录)导航至 frameworks/native Git 项目:
cd frameworks/native
使用以下命令启动临时项目:
repo start
使用编辑器在以下位置修改 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. 成功更改颜色之后的屏幕外观
修正测试
Codelab 的这个部分利用了一个示例测试,该测试位于源代码树中,并且已经失败。
如需运行、调试和修正测试,请按以下说明操作:
运行以下命令:
atest DevCodelabTest
测试失败。
注意:atest 是一个命令行工具,可让您在本地构建、安装和运行 Android 测试。
检查失败的测试的堆栈轨迹:
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 中的项目进行代码审核,请使用基于网络的代码审核系统 Gerrit。
重要提示:如需查看和回应更改,请确保您已登录 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 中提交更改并将更改合并到代码库中。 然而在此 Codelab 中,请还原您的工作:
在 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 平台开发入门 Codelab 的全部内容。
获取帮助
如果您在学习此 Codelab 期间遇到错误,请通过任意页面底部的问题跟踪器链接报告这些错误。若有疑问,请发送至 android-building 群组。
输入 ps -A | grep crosvm 以查看 crosvm 是否已在运行。如果 crossvm 正在运行,请输入 stop_cvd || true 或 kill crosvm 进程,并附上进程 PID。