尝试 Android 开发

本教程让您可以首次尝试 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

  1. 下载当前软件包信息

    sudo apt-get update
  2. 运行以下命令以安装 Repo 启动器

    sudo apt-get install repo

    Repo 启动器提供了一个 Python 脚本,用于初始化检出并下载完整的 Repo 工具。

    如果成功,请跳到第 4 步。

  3. (可选)使用以下一系列命令手动安装 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 启动器。

  4. 验证 Repo 启动器版本

    repo version

    输出应指示 2.4 或更高版本,例如

    repo launcher version 2.45

下载 Android 源代码

Android 源代码位于 Google 托管的 Git 代码库集合中。每个 Git 代码库都包含 Android 源代码的完整历史记录,包括对源代码的更改以及进行更改的时间。要下载 Android 源代码

  1. 导航到您的主目录

    cd ~
  2. 在其中创建一个本地工作子目录

    mkdir aosp
  3. 导航到该目录

    cd aosp
  4. 初始化 AOSP 代码库源代码 main 分支(默认分支)

    repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
  5. 输入或接受您的 Git 凭据(姓名、电子邮件地址)。

  6. 同步源代码

    repo sync -c -j8

    如果您在下载过程中遇到任何问题,请参阅排查并修复同步问题

构建代码

要构建代码

  1. 在您的工作目录中,执行 envsetup.sh 脚本以设置您的构建环境

    source build/envsetup.sh
  2. 使用 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
    ============================================
    
  3. 构建目标

    m

预计首次构建将花费数小时。后续构建花费的时间会大大减少。您的构建输出显示在 $OUT_DIR 中。

启动 Cuttlefish

Cuttlefish 是用于测试您的 build 的 Android 模拟器。

  1. 运行以下命令以下载、构建和安装主机 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 规则。

  2. 启动 Cuttlefish

    launch_cvd --daemon
    
  3. 通过在您的 Web 浏览器中导航到 https://127.0.0.1:8443,连接到 Cuttlefish 设备。您的虚拟 Android 设备随即会显示出来。

进行更改

按照此变更列表示例更新源代码。

  1. 在您的检出根目录(aosp/ 目录)中,导航到 frameworks/native Git 项目

    cd frameworks/native
  2. 使用以下命令启动临时项目

    repo start <some-name> .
  3. 使用您的编辑器编辑以下位置的 SurfaceFlinger.cpp

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. 找到这行代码

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. 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});
    
  6. 构建代码

    m
  7. 更新设备上的 build

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. 验证您是否在您选择的设备上看到了颜色变化,这与图 1 中显示的内容类似。

    Example of a successful color change

    图 1. 成功更改颜色后的屏幕外观

修复测试

本部分代码实验室使用源代码树中一个失败的示例测试。

要运行、调试和修复测试,请按照以下说明操作

  1. 运行

    atest DevCodelabTest

    测试失败。

  2. 检查失败测试的堆栈轨迹

    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 的文件中。

  3. 要确定要修复的测试的位置,请将 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

  4. 编辑 platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java,并将 Assert.assertTrue(false) 替换为 Assert.assertTrue(true)

  5. 再次运行测试以验证您是否修复了问题

    atest DevCodelabTest

上传您的代码以供审核

Repo 通过捆绑 git clone 等命令简化了 Git 的使用,以便一次处理多个 Git 代码库(或项目)。

对于 Git 中项目的代码审核,请使用基于 Web 的代码审核系统Gerrit

  1. 假设您在 frameworks/native 项目中进行了更改,请运行以下命令以上传您的更改

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. 对于您的提交消息,请输入以下内容

    Android codelab change
    Test: manual atest
    
  3. 上传您的更改

    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 中提交您的更改并将其合并到代码库中。但是,为了本代码实验室的目的,请恢复您的工作

  1. 在 Gerrit 中,点击 Abandon(放弃)。

  2. 放弃 frameworks/native 项目目录(或其子目录)中关联的临时分支

    repo abandon codelab .
  3. 恢复您对测试文件所做的更改。由于您没有对测试更改运行 repo startgit commitrepo 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 进程。