提交补丁程序

本页面介绍了向 Android 开源项目 (AOSP) 提交补丁程序的全过程,包括查看和跟踪 Gerrit 的更改。

前提条件

贡献者须知

向服务器验证身份

在上传到 Gerrit 之前,需要编译密码,该密码用于在服务器中识别您的身份。请按照密码生成器页面上的说明操作。您只需执行此流程一次即可。如需了解更多详情,请参阅使用身份验证

启动 Repo 分支

在您打算进行的每项更改中,在相关 Git 代码库中启动一个新分支:

    repo start NAME .
    

您可以在同一代码库中同时启动多个独立的分支。NAME 分支位于工作区本地,且不包含在 Gerrit 或最终源代码树中。

做出更改

修改源文件后,请将更改提交到本地代码库:

    git add -A
    git commit -s
    

请在提交消息中提供相关更改的详细说明。该说明会被推送到公开 AOSP 代码库,因此请遵循以下准则来撰写更改列表说明:

  • 以一行摘要(最多 50 个字符)开头,后跟一个空白行。这是 Git 和 Gerrit 使用的格式,适用于各种显示屏。

  • 从第三行开始输入较长的说明,说明会在达到 72 个字符时自动硬回车换行。描述更改所解决的问题及其解决方式。尽管我们建议您提供第二部分的内容,但这在实现新功能时是可选内容。

  • 添加简要说明,描述对于其他贡献者处理此功能而言可能非常重要的任何假设或背景信息。

以下是提交消息示例:

Short description on first line

    More detailed description of your patch,
    which is likely to take up multiple lines.
    

repo init 期间提供的唯一更改 ID 以及您的姓名和电子邮件会自动添加到您的提交消息中。

正在上传到 Gerrit

在将更改提交到个人历史记录后,使用以下方式将更改上传到 Gerrit:

    repo upload
    

如果您在相同代码库中启动了多个分支,系统会提示您选择要上传的分支。

上传成功后,Repo 会向您提供 Gerrit 上新网页的网址。访问该链接可在审核服务器上查看您上传的补丁程序、添加注释,或者为您的补丁程序申请特定审核者。

上传替换补丁程序

假设某位审核者已看过您的补丁程序,并要求您进行一些小小的修改。您可以在 Git 中修改提交内容,此操作会在 Gerrit 上创建一个新修补程序,其更改 ID 与原始更改 ID 相同。

    git add -A
    git commit --amend
    

当您上传修改后的补丁程序时,它会替换 Gerrit 和您本地 Git 历史记录中的原始补丁程序。

解决同步冲突

如果其他补丁程序提交到与您的源代码树冲突的源代码树,您需要在源代码库的新 HEAD 上对补丁程序执行 rebase 操作。执行此操作的一种简单方法是运行以下命令:

    repo sync
    

此命令首先会从源服务器获取更新,然后尝试自动将您的 HEAD rebase 到新的远程 上。

如果自动 rebase 操作不成功,请执行手动 rebase 操作。

    repo rebase
    

使用 git mergetool 可能会有助于您处理 rebase 冲突。成功合并冲突的文件后,请运行:

    git rebase --continue
    

自动或手动 rebase 完成后,请运行 repo upload 以提交 rebase 后的补丁程序。

提交内容获得批准后

在提交内容通过审核和验证流程之后,Gerrit 会自动将更改合并到公开代码库。其他用户可以运行 repo sync 将更新添加到本地客户端。

上游项目

Android 会使用许多其他开源项目,如 Linux 内核和 WebKit,如 Android 软件管理中所述。对于 external/ 下的大多数项目,请在上游进行更改,然后将包含这些更改的新上游版本告知 Android 维护人员。上传补丁程序也可能有助于我们跟踪新的上游版本,但如果是 Android 中广泛使用的项目(如下面提到的大多数大型项目),我们将很难做出更改。在这种情况下,我们倾向于在每次发布版本时进行升级。

一个有趣的特殊情况是 Bionic。因为大部分代码都是来自 BSD,所以除非对 Bionic 的新代码进行更改,否则我们更倾向于进行上游修复,然后从适当的 BSD 提取全新文件。

ICU4C

ICU-TC 主页external/icu4c 执行对 ICU4C 项目的所有更改。如需了解详情,请参阅提交 ICU 错误和功能请求

LLVM/Clang/Compiler-rt

LLVM 编译程序基础架构页上,对与 LLVM 相关的项目(external/clangexternal/compiler-rtexternal/llvm)进行所有更改。

mksh

external/mksh 对 MirBSD Korn Shell 项目进行所有更改,方式是发送电子邮件到 mirbsd.org 域上的 miros-mksh(无需订阅即可提交),或在 Launchpad 进行。

OpenSSL

OpenSSL 页面上的 external/openssl 进行对 OpenSSL 项目的所有更改。

V8

V8 问题页面上的 external/v8 提交对 V8 项目的所有更改。如需了解详情,请参阅为 V8 贡献代码

WebKit

WebKit 页面external/webkit 进行对 WebKit 项目的所有更改。通过归档 WebKit 错误启动该过程。在错误中,如果错误是针对 Android 的,请在 PlatformOS 字段中使用 Android。添加建议的修复程序并纳入测试后,错误很可能会引起审核者的注意。如需了解详情,请参阅为 WebKit 贡献代码

zlib

zlib 主页上的 external/zlib 对 zlib 项目进行所有更改。