凌峰创科服务平台

Android repo 服务器如何搭建与使用?

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

Android repo 服务器如何搭建与使用?-图1
(图片来源网络,侵删)

什么是 Android Repo 服务器?

Android Repo 服务器不是一个单一的服务器,而是一套基于 Git 的代码管理解决方案的总称

它的核心目标是解决一个巨大的问题:Android 代码库非常庞大,由数百个(甚至上千个)独立的 Git 仓库组成。

如果直接使用 git clone,你需要:

  1. 去 AOSP 官网查找一个包含所有项目列表的文件。
  2. 循环执行上百次 git clone 命令。
  3. 每次更新时,又要执行上百次 git pull 命令,并且要手动处理它们之间的依赖关系。

这会非常繁琐且容易出错。

Android repo 服务器如何搭建与使用?-图2
(图片来源网络,侵删)

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 文件)。
  • Repo 客户端:就是你电脑上运行的 repo 命令,它负责:

    • 与 Repo 服务器通信,获取项目清单。
    • 并行地调用 git 命令来同步、管理所有这些 Git 仓库。
    • 简化代码的提交、上传和分支管理流程。

为什么需要 Repo 服务器?(核心优势)

使用 Repo 系统而不是直接使用 Git,主要有以下几个关键优势:

Android repo 服务器如何搭建与使用?-图3
(图片来源网络,侵删)
  1. 原子性操作

    • 问题:Android 的一个功能可能横跨十几个甚至几十个仓库,如果用 Git,你需要分别在这几十个仓库里创建分支、修改代码、提交,这非常容易出错,比如漏掉某个仓库的修改。
    • Repo 解决方案:Repo 将所有仓库的操作捆绑在一起,当你执行 repo start my-new-branch 时,它会同时在所有相关仓库中创建名为 my-new-branch 的分支。repo sync 也能同步所有仓库到同一状态,这保证了整个代码库的一致性。
  2. 统一的代码审查流程

    • 问题:分散的 Git 仓库意味着分散的代码审查,审查者很难追踪一个功能在所有相关仓库中的完整代码变更。
    • Repo 解决方案:通过 Gerrit,开发者执行 repo upload 后,所有仓库的代码变更会被打包成一个“变更集”(Change-Set)提交到 Gerrit,审查者可以在一个界面上看到所有相关的代码差异,统一进行评论和批准,这极大地提升了代码质量和协作效率。
  3. 高效的同步和依赖管理

    • 问题:仓库之间存在依赖关系。frameworks/base 可能依赖于 libcorelibcore 的代码有更新,frameworks/base 可能也需要同步更新,手动管理这些依赖非常困难。
    • Repo 解决方案manifest 仓库是整个系统的“大脑”,它定义了每个项目的仓库地址、默认分支、以及它们之间的依赖关系。repo sync 命令会读取 manifest 文件,自动按正确的顺序和版本同步所有项目,确保依赖关系始终正确。
  4. 版本管理和发布管理

    • 问题:如何表示一个 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 是如何协同工作的:

  1. 初始化仓库

    # 指定 manifest 仓库的 URL,并创建一个本地工作目录
    repo init -u https://android.googlesource.com/platform/manifest
    # 同步所有代码,第一次会非常慢
    repo sync
  2. 开始开发

    # 创建一个新分支,Repo 会在所有项目中创建同名分支
    repo start my-feature-branch
    # 然后像操作普通 Git 仓库一样修改代码
    cd frameworks/base
    git add ... && git commit -m "My new feature"
    # 对其他仓库做同样操作...
  3. 同步更新

    # 从上游拉取所有最新代码,并解决冲突
    repo sync
  4. 提交代码进行审查

    # 将所有仓库的提交打包,上传到 Gerrit 服务器
    repo upload

    执行后,你会看到一个 URL,打开这个 URL 就可以在 Gerrit 界面上看到你的代码变更,等待他人审查。

  5. 代码审查与合并

    • 其他开发者通过 Gerrit 审查你的代码,发表评论。
    • 你根据评论修改代码,然后再次 repo upload 更新你的变更集。
    • 当审查通过后,有权限的“合并者”(Committer)会在 Gerrit 上点击“Submit”按钮,你的代码就会被正式合并到主分支。

主要的 Android Repo 服务器

  1. Google 官方 AOSP 服务器

    • 地址: https://android.googlesource.com/
    • 用途: 这是获取最新 AOSP 源码的主要服务器,所有 Android 的官方项目都托管在这里。
    • 关联的 Gerrit: https://android-review.googlesource.com/
  2. AOSP 第三方镜像服务器

    • 地址: https://aosp-mirror.google.cn/
    • 用途: 由于网络原因,直接从 Google 服务器同步代码非常慢,这个镜像服务器位于中国大陆,由 Google 官方提供,可以极大地提升国内开发者的同步速度。
    • 如何使用: 只需将 repo init 命令中的 URL 换成镜像地址即可。
      repo init -u https://aosp-mirror.google.cn/platform/manifest
  3. LineageOS 等第三方 ROM 服务器

    • 像 LineageOS、Pixel Experience 等基于 AOSP 定制的 ROM 项目,它们也有自己的 Repo 服务器,它们通常会基于 AOSP 的某个版本,然后添加或修改自己的项目。
    • LineageOS: https://github.com/LineageOS
  4. 公司内部的私有服务器

    • 大型手机厂商(如小米、华为、OPPO)或进行 Android 深度开发的公司,几乎都会搭建一套私有的 Repo 服务器。
    • 组成部分:
      • 私有的 Git 服务器 (如 GitLab, Gitea, 或自研的)。
      • 私有的 Gerrit 服务器 (用于内部代码审查)。
      • 私有的 Manifest 仓库 (定义公司内部的项目和依赖)。
    • 目的: 保护公司核心代码,建立统一的开发、审查和发布流程。

特性 直接使用 Git 使用 Repo 服务器
管理对象 单个或少量仓库 成百上千个仓库的集合
操作原子性 无,需手动管理每个仓库 ,所有仓库操作保持一致
代码审查 分散,难以追踪 统一,通过 Gerrit 集中审查
版本控制 依赖 Git 的标签和分支 强大,通过 Manifest 定义版本和依赖
学习曲线 较低 较高,需要理解 Repo 和 Gerrit 的概念
适用场景 普通应用开发、小型项目 AOSP 开发、大型 Android 项目、定制 ROM

Android Repo 服务器是一个为管理超大规模、多仓库、强依赖的代码库而生的工程化解决方案,它通过将 Git 的强大功能与 Gerrit 的审查流程以及 Manifest 的元数据管理相结合,为 Android 生态系统的协作开发提供了坚实的基础。

分享:
扫描分享到社交APP
上一篇
下一篇