概览

要使用 Android 代码,您需要使用 Git(一种开源版本控制系统)和 Repo(一种对 Git 构成补充的 Google 代码库管理工具)。

Git

Git 旨在处理分布在多个代码库上的大型项目。Android 使用 Git 执行本地操作,例如建立本地分支、提交、对比差异、修改。打造 Android 项目所面临的挑战之一就是确定如何最好地支持外部社区 - 从业余爱好者社区到生产大众消费类设备的大型 OEM。我们希望组件可以替换,并希望有趣的组件能够在 Android 之外自行发展。我们最初决定使用一种分布式修订版本控制系统,经过筛选,最后选中了 Git。

要详细了解 Git,请参阅 Git 文档

Repo

Repo 可以在必要时整合 Git 代码库,将相关内容上传到我们的 Gerrit 修订版本控制系统,并自动执行 Android 开发工作流程的部分环节。Repo 并非用来取代 Git,只是为了让您在 Android 环境中更轻松地使用 Git。Repo 命令是一段可执行的 Python 脚本,您可以将其放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作。例如,您可以用一个 Repo 命令,将文件从多个代码库下载到本地工作目录。

在大多数情况下,您可以仅使用 Git(不必使用 Repo),或结合使用 Repo 和 Git 命令以组成复杂的命令。不过,使用 Repo 执行基本的跨网络操作可大大简化您的工作。要详细了解 Repo,请参阅 Repo 命令参考资料

其他工具

其他工具包括 Gerrit,这是一个基于网页的代码审核系统,适用于使用 Git 的项目。Gerrit 允许所有授权用户提交更改(如果通过代码审核,这些更改会自动纳入项目中),以此鼓励他们更集中地使用 Git。此外,Gerrit 可以在浏览器中并排显示更改,并支持代码内注释,使得审核工作变得更轻松。

最后,Android Studio 是用于开发 Android 应用的官方集成开发环境 (IDE)。

工作流程

Android 开发涉及以下基本工作流程:

基本工作流程示意图
图 1. Android 基本工作流程

 

  1. 使用 repo start 新建一个主题分支。
  2. 修改文件。
  3. 使用 git add 暂存更改。
  4. 使用 git commit 提交更改。
  5. 使用 repo upload 将更改上传到审核服务器。

常见任务

在 Android 代码库中使用 Git 和 Repo 会涉及到执行以下常见任务:

命令 说明
repo init 初始化一个新客户端。
repo sync 将客户端同步到代码库。
repo start 新建一个分支。
repo status 显示当前分支的状态。
repo upload 将更改上传到审核服务器。
git add 暂存文件。
git commit 提交已暂存文件。
git branch 显示当前分支。
git branch [branch] 创建新的主题分支。
git checkout [branch] 将 HEAD 切换到指定分支。
git merge [branch] 将 [branch] 合并到现有分支。
git diff 显示未暂存更改的 diff 结果。
git diff --cached 显示已暂存更改的 diff 结果。
git log 显示现有分支的历史记录。
git log m/[codeline].. 显示未推送的提交。

要了解如何使用 Repo 下载源代码,请参阅下载源代码Repo 命令参考资料

同步客户端

要同步所有可用项目的文件,请运行以下命令:

repo sync

要同步所选项目的文件,请运行以下命令:

repo sync PROJECT0 PROJECT1 ... PROJECTN

创建主题分支

当您开始进行更改(例如当您开始修复错误或实现新功能)时,请在本地工作环境中新建一个主题分支。主题分支是原始文件的副本;它指向某一项提交记录,可以简化创建本地分支以及在本地分支之间进行切换的操作。通过使用分支,您可以将工作的某个方面与其他方面分隔开来。请参阅分隔主题分支(一篇有关使用主题分支的有趣文章)。

要使用 Repo 新建一个主题分支,请转到相应项目并运行以下命令:

repo start BRANCH_NAME .

尾随句点 (.) 代表当前工作目录中的项目。

要验证新分支是否已创建,请运行以下命令:

repo status .

使用主题分支

要将分支分配给特定项目,请运行以下命令:

repo start BRANCH_NAME PROJECT_NAME

要查看所有项目的列表,请参阅 android.googlesource.com。如果您已转到相应的项目目录,则只需使用一个句点来表示当前项目即可。

要切换到本地工作环境中的另一个分支,请运行以下命令:

git checkout BRANCH_NAME

要查看现有分支的列表,请运行以下命令:

git branch

repo branches

这两个命令均可返回现有分支的列表,并会在当前分支的名称前面标注星号 (*)。

暂存文件

默认情况下,Git 会检测到您在项目中所做的更改,但不会跟踪这些更改。要让 Git 保存您的更改,您必须标记或暂存这些更改,以将其纳入到提交中。

要暂存更改,请运行以下命令:

git add

该命令接受将项目目录中的文件或目录作为参数。git add 并不像其名称表示的这样只是简单地将文件添加到 Git 代码库,它还可以用于暂存文件的修改和删除的内容。

查看客户端状态

要列出文件状态,请运行以下命令:

repo status

要查看未提交的修改(标记为需要提交的本地修改),请运行以下命令:

repo diff

要查看已提交的修改(已标记为需要提交的本地修改),请确保您已转到相应的项目目录,然后使用 cached 参数运行 git diff

cd ~/WORKING_DIRECTORY/PROJECT
git diff --cached
diff 与 diff-cached
图 2. 未提交的修改与已提交的修改

提交更改

在 Git 中,提交是修订版本控制的基本单位,包含目录结构的快照以及整个项目的文件内容。要在 Git 中创建提交,请运行以下命令:

git commit

当系统提示您输入提交消息时,请针对要提交至 AOSP 的更改提供一条简短(但有用)的消息。如果您不添加提交消息,提交将会中止。

将更改上传到 Gerrit

请更新至最新版本,然后上传相应更改:

repo sync
repo upload

运行此命令后,系统会随即列出您已提交的更改,并提示您选择要上传到审核服务器的哪个分支。如果只有一个分支,则您会看到一个简单的 y/n 提示符。

解决同步冲突

如果 repo sync 命令提示同步冲突,请执行以下操作:

  1. 查看未合并的文件(状态代码 = U)。
  2. 根据需要修改存在冲突的地方。
  3. 对相关项目目录进行更改。添加并提交受影响的文件,然后对这些更改执行“衍合”(rebase) 命令:
    git add .
    git commit
    git rebase --continue
    
  4. 当衍合完成后,再一次开始整个同步过程:
    repo sync PROJECT0 PROJECT1 ... PROJECTN
    

清理客户端

将更改合并到 Gerrit 之后,请更新您的本地工作目录,然后使用 repo prune 安全地移除已过时的主题分支:

repo sync
repo prune

删除客户端

由于所有状态信息都会存储在客户端中,您只需从文件系统中删除相应目录即可:

rm -rf WORKING_DIRECTORY

删除客户端将永久删除您尚未上传以供审核的所有更改。