本教程将引导您首次尝试 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 使用 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 <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. 成功更改颜色之后的屏幕外观
修正测试
Codelab 的这个部分利用了一个示例测试,该测试位于源代码树中,并且已经失败。
如需运行、调试和修正测试,请按以下说明操作:
运行以下命令:
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 中的项目进行代码审核,请使用基于网络的代码审核系统 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。