本文结合一个实际用于 Android 14 + Redroid 的 manifest 片段,对 <manifest> 中各种常用标签和属性进行解释。重点讲解:
-
<remove-project>的用途 -
groups、remote、revision的含义 -
多 remote、多项目定制的完整流程
Manifest 基本结构
Android 使用 repo 工具 统一管理多个 Git 仓库,而这些仓库的组织方式由 manifest.xml 描述。一个 manifest 典型结构如下:
<manifest>
<remote ... />
<project ... />
<remove-project ... />
<include ... />
</manifest>
下面基于 manifest 文件逐项解析。
1. <remote> --- 远端仓库定义
示例:
<remote name="origin" fetch="https://git.example.com/android14/" revision="android-tag" />
<remote name="redroid" fetch="https://github.com/example-redroid/" revision="redroid-14.0.0" />
✔ 用法说明
| 属性 | 说明 |
|---|---|
| name | remote 的名字,通过 remote="origin" 关联到 <project> |
| fetch | 仓库地址前缀,后面会拼接 <project name=""> 的路径 |
| revision | 默认分支。如果 <project> 没有单独指定 revision,则继承 remote 的 revision |
例如:
fetch="https://git.example.com/android14/"
配合
<project name="platform_frameworks_base" />
最终仓库地址变成:
https://git.example.com/android14/platform_frameworks_base.git
2. <remove-project> --- 移除原生 AOSP 中不需要的仓库(重点)
这是定制 Android 时最常见的操作之一。
示例:
<remove-project name="platform/frameworks/base" />
<remove-project name="platform/packages/apps/Gallery2" />
✔ 用途
从 AOSP 默认 manifest 中移除指定项目,使 repo 不再同步这些仓库。
当你需要:
-
替换 AOSP 的原生模块(frameworks/base、frameworks/native 等)
-
因为 Redroid 定制,使用自己的 patch 版本
-
不希望下载体积巨大的历史仓库(如 chromium-webview)
就会使用 <remove-project>。
✔ remove-project 是如何生效的?
repo 解析 manifest 时:
-
加载 Google 提供的默认 manifest(AOSP 默认项目)
-
处理
<remove-project>,把指定 name 的项目移除 -
加载你新的
<project>标签(替代内容)
因此你可以安全地用自己的版本覆盖系统模块。
3. <project> --- 指定要同步的 Git 仓库
示例:
<project
path="frameworks/base"
name="platform_frameworks_base"
groups="redroid,aosp,pdk"
remote="origin" />
✔ 属性说明
| 属性 | 说明 |
|---|---|
| path | 同步到本地的目录路径(本地目录) |
| name | Git 仓库名(会拼接到 remote.fetch) |
| remote | 使用哪个 <remote> 的地址 |
| revision | 指定分支(可覆盖 remote 默认 revision) |
| groups | 项目归属的组,可用于 repo sync -g 选择性同步 |
| clone-depth | 使用浅克隆,减少仓库体积(类似 git clone --depth=1) |
groups 的详细解释(重点)
示例:
groups="redroid,aosp,pdk"
groups 本质是标签,用于将项目分类。
例如:
-
你可以用
repo sync -g redroid只同步 Redroid 相关仓库
-
aosp、pdk是 AOSP 内置组
这是管理多模块项目的最佳实践。
revision 的详细解释(重点)
Revision 代表项目要同步的分支。
继承机制:
-
如果
<project>有自己的 revision → 优先使用 -
如果没有 → 使用
<remote>的 revision -
如果 remote 也没有 → 使用 repo 默认分支(通常 master/main)
示例
<remote name="origin" revision="android-tag" />
则所有未指定 revision 的项目默认用:android-tag。适用于统一版本管理。
4. <include> --- 引入额外 manifest
示例:
<include name="webview.xml"/>
<include name="redroid_ext.xml"/>
用途:
-
拆分 manifest,保持主 manifest 简洁
-
方便维护大型项目(如 chromium-webview、输入法、扩展组件等)
最终结合本 manifest 的工作流程
-
定义两个远端
origin和redroid -
使用
<remove-project>移除 AOSP 默认仓库 -
使用
<project>重新添加来自自有 Git 仓库的定制版本 -
添加 Redroid 自有仓库(device/redroid、hardware/redroid 等)
-
include 其他子 manifest(webview、extensions 等)
这个结构非常适合"自定义安卓 + Redroid 虚拟化 Android 设备"的场景。
总结
本文说明了 manifest 中最常用的标签:
| 标签 | 作用 |
|---|---|
<remote> |
定义仓库地址前缀 |
<project> |
指定具体仓库及本地目录 |
<remove-project> |
移除 AOSP 默认仓库(用于替换) |
<include> |
引入其他 manifest 子文件 |
groups |
项目分类,可选择性同步 |
revision |
绑定指定分支,支持继承 |