这是一个非常重要且核心的概念,对于任何进行 Android 系统开发、AOSP(Android Open Source Project)定制或大型 Android 项目开发的开发者来说都至关重要。

什么是 Android Repo 服务器?
Android Repo 服务器不是一个单一的服务器,而是一套基于 Git 的代码管理解决方案的总称。
它的核心目标是解决一个巨大的问题:Android 代码库非常庞大,由数百个(甚至上千个)独立的 Git 仓库组成。
如果直接使用 git clone,你需要:
- 去 AOSP 官网查找一个包含所有项目列表的文件。
- 循环执行上百次
git clone命令。 - 每次更新时,又要执行上百次
git pull命令,并且要手动处理它们之间的依赖关系。
这会非常繁琐且容易出错。

Repo 就是为了解决这个问题而生的,它是一个 Python 脚本,作为一个“元”代码管理工具,工作在 Git 之上。
-
Repo 服务器:通常指代整个 Repo 系统的后端,它包括:
- 一个 Git 服务器集群:用于托管成百上千个独立的 Git 代码仓库(如
platform/manifest,frameworks/base,packages/apps/Settings等),这个服务器通常是 Google 自己维护的,android.googlesource.com。 - 一个 Gerrit 服务器:这是代码审查的核心,开发者提交的代码不会直接合并到主分支,而是先上传到 Gerrit,供其他开发者审查、评论和批准,Gerrit 内部也集成了 Git 功能。
- 一个 Repo 服务端:这个服务端负责处理
repo init,repo sync等命令的请求,并返回相应的元数据(如 manifest 文件)。
- 一个 Git 服务器集群:用于托管成百上千个独立的 Git 代码仓库(如
-
Repo 客户端:就是你电脑上运行的
repo命令,它负责:- 与 Repo 服务器通信,获取项目清单。
- 并行地调用
git命令来同步、管理所有这些 Git 仓库。 - 简化代码的提交、上传和分支管理流程。
为什么需要 Repo 服务器?(核心优势)
使用 Repo 系统而不是直接使用 Git,主要有以下几个关键优势:

-
原子性操作
- 问题:Android 的一个功能可能横跨十几个甚至几十个仓库,如果用 Git,你需要分别在这几十个仓库里创建分支、修改代码、提交,这非常容易出错,比如漏掉某个仓库的修改。
- Repo 解决方案:Repo 将所有仓库的操作捆绑在一起,当你执行
repo start my-new-branch时,它会同时在所有相关仓库中创建名为my-new-branch的分支。repo sync也能同步所有仓库到同一状态,这保证了整个代码库的一致性。
-
统一的代码审查流程
- 问题:分散的 Git 仓库意味着分散的代码审查,审查者很难追踪一个功能在所有相关仓库中的完整代码变更。
- Repo 解决方案:通过 Gerrit,开发者执行
repo upload后,所有仓库的代码变更会被打包成一个“变更集”(Change-Set)提交到 Gerrit,审查者可以在一个界面上看到所有相关的代码差异,统一进行评论和批准,这极大地提升了代码质量和协作效率。
-
高效的同步和依赖管理
- 问题:仓库之间存在依赖关系。
frameworks/base可能依赖于libcore。libcore的代码有更新,frameworks/base可能也需要同步更新,手动管理这些依赖非常困难。 - Repo 解决方案:
manifest仓库是整个系统的“大脑”,它定义了每个项目的仓库地址、默认分支、以及它们之间的依赖关系。repo sync命令会读取manifest文件,自动按正确的顺序和版本同步所有项目,确保依赖关系始终正确。
- 问题:仓库之间存在依赖关系。
-
版本管理和发布管理
- 问题:如何表示一个 Android 版本(如 Android 13, Tiramisu)?如何快速切换到某个历史版本?
- Repo 解决方案:
manifest仓库中的不同分支或标签就对应了不同的 Android 版本。android-13.0.0_r1这个标签就精确地指向了 Android 13 发布时所有仓库的代码版本,执行repo init -b android-13.0.0_r1就可以一键切换到整个 AOSP 的历史版本。
Repo 服务器的工作流程
下面是一个典型的开发工作流程,展示了 Repo、Git 和 Gerrit 是如何协同工作的:
-
初始化仓库
# 指定 manifest 仓库的 URL,并创建一个本地工作目录 repo init -u https://android.googlesource.com/platform/manifest # 同步所有代码,第一次会非常慢 repo sync
-
开始开发
# 创建一个新分支,Repo 会在所有项目中创建同名分支 repo start my-feature-branch # 然后像操作普通 Git 仓库一样修改代码 cd frameworks/base git add ... && git commit -m "My new feature" # 对其他仓库做同样操作...
-
同步更新
# 从上游拉取所有最新代码,并解决冲突 repo sync
-
提交代码进行审查
# 将所有仓库的提交打包,上传到 Gerrit 服务器 repo upload
执行后,你会看到一个 URL,打开这个 URL 就可以在 Gerrit 界面上看到你的代码变更,等待他人审查。
-
代码审查与合并
- 其他开发者通过 Gerrit 审查你的代码,发表评论。
- 你根据评论修改代码,然后再次
repo upload更新你的变更集。 - 当审查通过后,有权限的“合并者”(Committer)会在 Gerrit 上点击“Submit”按钮,你的代码就会被正式合并到主分支。
主要的 Android Repo 服务器
-
Google 官方 AOSP 服务器
- 地址:
https://android.googlesource.com/ - 用途: 这是获取最新 AOSP 源码的主要服务器,所有 Android 的官方项目都托管在这里。
- 关联的 Gerrit:
https://android-review.googlesource.com/
- 地址:
-
AOSP 第三方镜像服务器
- 地址:
https://aosp-mirror.google.cn/ - 用途: 由于网络原因,直接从 Google 服务器同步代码非常慢,这个镜像服务器位于中国大陆,由 Google 官方提供,可以极大地提升国内开发者的同步速度。
- 如何使用: 只需将
repo init命令中的 URL 换成镜像地址即可。repo init -u https://aosp-mirror.google.cn/platform/manifest
- 地址:
-
LineageOS 等第三方 ROM 服务器
- 像 LineageOS、Pixel Experience 等基于 AOSP 定制的 ROM 项目,它们也有自己的 Repo 服务器,它们通常会基于 AOSP 的某个版本,然后添加或修改自己的项目。
- LineageOS:
https://github.com/LineageOS
-
公司内部的私有服务器
- 大型手机厂商(如小米、华为、OPPO)或进行 Android 深度开发的公司,几乎都会搭建一套私有的 Repo 服务器。
- 组成部分:
- 私有的 Git 服务器 (如 GitLab, Gitea, 或自研的)。
- 私有的 Gerrit 服务器 (用于内部代码审查)。
- 私有的 Manifest 仓库 (定义公司内部的项目和依赖)。
- 目的: 保护公司核心代码,建立统一的开发、审查和发布流程。
| 特性 | 直接使用 Git | 使用 Repo 服务器 |
|---|---|---|
| 管理对象 | 单个或少量仓库 | 成百上千个仓库的集合 |
| 操作原子性 | 无,需手动管理每个仓库 | 有,所有仓库操作保持一致 |
| 代码审查 | 分散,难以追踪 | 统一,通过 Gerrit 集中审查 |
| 版本控制 | 依赖 Git 的标签和分支 | 强大,通过 Manifest 定义版本和依赖 |
| 学习曲线 | 较低 | 较高,需要理解 Repo 和 Gerrit 的概念 |
| 适用场景 | 普通应用开发、小型项目 | AOSP 开发、大型 Android 项目、定制 ROM |
Android Repo 服务器是一个为管理超大规模、多仓库、强依赖的代码库而生的工程化解决方案,它通过将 Git 的强大功能与 Gerrit 的审查流程以及 Manifest 的元数据管理相结合,为 Android 生态系统的协作开发提供了坚实的基础。
