尝试 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 使用 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:

  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 代码库源代码主分支(默认):

    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
    

第一次构建预计需要几个小时。后续构建所需的时间会大大减少。 build 的输出会显示在 $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. 在网络浏览器中前往 https://localhost: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 的颜色变化。

    成功更改颜色的示例

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

修复测试问题

Codelab 的这个部分利用了一个示例测试,该测试位于源代码树中,并且已经失败。

如需运行测试、执行调试并修复测试问题,请按以下说明操作:

  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 中的项目进行代码审核,请使用基于网络的代码审核系统 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 中提交更改并将更改合并到代码库中。 然而在此 Codelab 中,请还原您的工作:

  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 平台开发入门 Codelab 的全部内容。

获取帮助

如果您在学习此 Codelab 期间遇到错误,请通过任意页面底部的问题跟踪器链接报告这些错误。若有疑问,请发送至 android-building 群组。

输入 ps -A | grep crosvm 以查看 crosvm 是否已在运行。如果 crossvm 正在运行,请输入 stop_cvd || truekill crosvm 进程,并附上进程 PID。