3、Git与Repo工具:安装Git、配置SSH密钥、安装Repo工具、理解Repo的工作流

好,咱们进入第三节课。说实话,这一章的内容是AOSP开发的「入场券」。你想想看,没有Git和Repo,你连代码都拉不下来,后面的编译、调试全是空谈。我在带新人时,经常看到有人卡在这一步——不是SSH密钥配错了,就是Repo装不上。嗯,今天咱们就把这些坑一个个填平。

3.1 安装Git

Git是AOSP的基石。整个Android源码都是用Git管理的,每个仓库都是一个独立的Git项目。我个人习惯用最新稳定版,别用系统自带的旧版本——我在项目中遇到过因为Git版本太低导致repo sync失败的情况,折腾了半天才发现是版本问题。

Ubuntu/Debian系统:

sudo apt-get update
sudo apt-get install git git-lfs

macOS系统:

brew install git git-lfs

装完后验证一下:

git --version
# 输出示例:git version 2.39.2
我的建议:装完Git后,立刻配一下全局用户信息。很多人忘了这步,后面提交代码时会报错。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

为什么要配?因为Git每次提交都会记录作者信息。你想想看,如果没配,提交记录里会显示一堆奇怪的默认值,后面查问题都找不到人。

3.2 配置SSH密钥

拉取AOSP源码,推荐用SSH协议。为什么?因为HTTPS经常被墙,而且每次都要输密码,烦不烦?SSH配好了,一劳永逸。

第一步:生成密钥对

ssh-keygen -t rsa -b 4096 -C "你的邮箱@example.com"

执行后,系统会问你保存路径和密码。我建议直接回车用默认路径(~/.ssh/id_rsa),密码可以留空——当然,如果你对安全性要求高,设一个也行。

第二步:把公钥添加到Git服务器

查看公钥内容:

cat ~/.ssh/id_rsa.pub

复制全部输出,然后登录你的Git托管平台(比如Gerrit、GitHub、GitLab),在SSH Keys设置里粘贴保存。

注意:千万不要把私钥(id_rsa)泄露出去!我曾经见过有人把私钥传到GitHub上,结果被机器人扫到,服务器直接被挖矿程序入侵。

第三步:测试连接

ssh -T git@android.googlesource.com

如果看到类似「Welcome to Gerrit Code Review」的提示,说明配置成功了。

3.3 安装Repo工具

Repo是Google专门为AOSP开发的一个工具。说白了,它就是Git的「管家」——帮你同时管理几百个Git仓库。你想想看,AOSP有上千个仓库,一个个git clone得克隆到猴年马月?Repo就是来解决这个问题的。

安装步骤:

# 创建bin目录(如果不存在)
mkdir -p ~/bin

# 下载Repo脚本
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

# 赋予执行权限
chmod a+x ~/bin/repo

# 把~/bin加入PATH
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
source ~/.bashrc

验证安装:

repo --version

如果输出版本号,就说明装好了。

避坑指南:我曾经在Windows上用Repo,结果各种路径问题。后来我学乖了——AOSP开发,老老实实用Linux或macOS。Windows用户建议装WSL2或者直接上Ubuntu虚拟机。

3.4 理解Repo的工作流

Repo的工作流,其实就三个核心概念:manifest、sync、upload。咱们一个一个说。

3.4.1 Manifest文件

Manifest是一个XML文件,它定义了AOSP包含哪些仓库、每个仓库的路径、分支、提交ID。你可以把它理解成「购物清单」——Repo拿着这个清单,去Git服务器上把代码一个个拉下来。

默认的manifest在:.repo/manifests/default.xml

一个典型的manifest条目长这样:

<project path="packages/apps/Settings"
         name="platform/packages/apps/Settings"
         revision="android-14.0.0_r1" />

这里path是本地路径,name是远程仓库名,revision是分支或Tag。

3.4.2 Repo Sync——拉取代码

这是最常用的命令:

repo sync -j8

-j8表示并行下载8个仓库。我建议根据你的CPU核心数来设,比如4核设-j4,8核设-j8。设太大反而会卡。

第一次sync会非常慢——AOSP完整源码大概30-50GB,网速好的话也要一两个小时。嗯,这时候可以去泡杯咖啡。

我的经验:如果sync中途断了,别慌。重新执行repo sync,它会断点续传。我经常在sync时切出去干别的,回来发现断了,再跑一次就行。

3.4.3 Repo Upload——提交代码

当你修改完代码,想提交到Gerrit审核时,流程是这样的:

# 在某个仓库内
git add .
git commit -m "我的修改"

# 回到AOSP根目录
repo upload

Repo会自动找到所有有未推送提交的仓库,然后逐个推送到Gerrit。它会打开一个编辑器让你填写审核信息,保存退出后就开始上传了。

3.4.4 其他常用命令

命令 作用 我的备注
repo start <分支名> 创建一个新分支开始工作 我习惯用这个,避免直接改默认分支
repo status 查看所有仓库的修改状态 比一个个git status快多了
repo diff 查看所有仓库的差异 提交前必跑一遍,检查有没有漏改
repo forall -c "命令" 对所有仓库执行同一命令 比如 repo forall -c "git checkout ." 一键还原所有修改

3.5 工作流实战:从拉取到提交

咱们走一遍完整流程,你感受一下:

  1. 初始化:repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1
  2. 拉取代码:repo sync -j8
  3. 创建分支:repo start my-feature
  4. 修改代码:在某个仓库里改文件
  5. 提交:git addgit commit
  6. 上传审核:repo upload

你看,是不是很清晰?说白了,Repo就是帮你把「管理几百个Git仓库」这件事,简化成了几个命令。

核心要点:

  • Git管理单个仓库,Repo管理整个AOSP项目
  • Manifest是「地图」,告诉Repo去哪里拉代码
  • Sync是「下载」,Upload是「提交」
  • 遇到网络问题,试试换源或加代理

好,这一章就到这里。下一章咱们开始真正搭建编译环境——装JDK、配置CCache、选编译目标。到时候你会看到,前面这些准备工作有多重要。