Android 开发者 Codelab

您可以为人类历史上安装量最大的操作系统的开发工作贡献一份力量。没错,您已经踏上了成为一名 Android 平台工程师的旅程。

尽管道路崎岖,但 Android 团队会在每次发布时竭力为您扫清障碍。该团队每天都会直接在 Android 开源项目 (AOSP) 中对其进行完善。

因此无需多虑,请安心启动终端,让我们一起创造历史。

目标

我们希望通过此 Codelab 实现以下两个目标:

  1. 让您大致了解一下 Android 工程师开发平台(操作系统)的工作流程。
  2. 欢迎您就 Android 的工具、文档和开发者工作流程提供反馈

前提条件

此 Codelab 的要求列表是根据一般平台 (AOSP) 开发的要求派生而来的。为参加此 Codelab,请进行以下设置:

环境

通常,用户直接在工作站上进行构建和开发。由于您可能会使用多种多样的终端,并且使用的许多命令都会因终端而异,因此您需要在每个终端会话中重新运行这些命令。具体而言,这些命令包括 source build/envsetup.shlunch

设置工作站

  1. 在工作站上安装必要的软件包
  2. 继续在终端中操作,安装 Repo 并获取相关凭据以访问所有 Git 代码库。

初始化并同步代码

  1. 导航到您的主目录:

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

    mkdir aosp
  3. 前往该目录:

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

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

  6. 同步源代码:

    repo sync -j8

初次同步可能需要一个小时或更长的时间。

每个 Repo 检出分支都由一个清单文件表示。您可以同时拥有多个 Repo 检出分支,只要它们位于不同的目录中即可。但请注意,每个检出分支和 build 大约需要使用 300 GB 存储空间(并且会不断增加),因此请不要超过 2 个 Repo 检出分支,或者也可以使用附加硬盘为您的系统扩容。

构建代码

如需构建 Android,您必须使用 lunch 命令选择要构建的目标设备类型。目标是指设备组合,例如特定型号或外形规格。

借助设备目标 aosp_cf_x86_64_phone-userdebug,您可以构建 Cuttlefish 虚拟 Android 设备,用于在没有实体设备的情况下进行测试。

如需改为构建和更新实体设备,请选择其他目标,并按照刷写设备的说明进行操作。

  1. 在源代码检出分支的根目录下运行以下命令,设置 Android 设备的构建环境:

    source build/envsetup.sh
  2. 将 build 目标传递给 lunch 命令,如下所示:

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
  3. 运行以下命令,在检出分支的任何位置构建代码:

    m

第一次构建预计需要几个小时。后续构建所需的时间会大大减少。

启动 Cuttlefish

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

  1. 如果您从未安装过 Cuttlefish,则必须安装必要的 Cuttlefish 依赖项。在终端窗口中,运行如下命令以下载、构建和安装主机 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
    adb sync
    adb reboot

验证您是否在所选设备上看到类似于图 1 的颜色变化。

成功更改颜色的示例

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

测试代码

Codelab 的这个部分利用了一个示例测试,该测试位于源代码树中,并且已经失败。该过程会采用 Atest 在本地运行测试并测试代码。

如需使用该测试,请按以下说明操作:

  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)
  3. 然后再看以下代码

    platform_testing/tests/example/devcodelab
    
  4. 如需获取要修改的文件,请在 android.test.example.devcodelab.DevCodelabTest 中获取测试名称,并将 . 替换为 / 以获取以下结果:

    src/android/test/example/devcodelab/DevCodelabTest.java
    
  5. 然后修改

    platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    

    以便将以下内容

    Assert.assertTrue(false)
    

    替换为

    Assert.assertTrue(true)
    
  6. 再次运行测试以验证您是否解决了问题:

    atest DevCodelabTest

上传代码以备审核

Repo 将 git clone 之类的命令捆绑在一起以同时用于众多 Git 代码库(或项目),让 Git 更加简单易用。

请参阅源代码控制工具以查看 Git 和 Repo 概览以及有关使用 Android 源代码的完整文档的链接。如需全面了解有哪些 Git 项目,以及与每个项目关联的分支对应的具体项目(路径),请浏览 AOSP 代码库

如需对 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 中查看您的更改

转到终端中显示的大致如下的链接:

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

以上就是 Android 平台开发入门 Codelab 的全部内容。有关后续步骤,请参阅提交补丁;有关 Android 开发的完整详细信息,请参阅本网站的其余部分。

还原更改

通常,在测试以及审核和批准后,您会在 Gerrit 中提交更改并将更改合并到代码库中。

然而在此 Codelab 中,请点击 Gerrit 中的 Abandon 来还原您的更改列表。

然后放弃 frameworks/native 项目目录(或其子目录)中的相关临时分支:

repo abandon codelab .

另外,请记得还原对测试文件所做的更改。由于您没有对更改运行 repo startgit commitrepo upload,因此可以重置文件本身。假设您位于 aosp/platform_testing directory 中,请使用以下命令重置文件:

git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
git checkout .

现在,大功告成!非常棒!

获取帮助

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