在之前的文章中,写了如何下载系统源码:【Android】系统源码下载及编译
这篇文章就写写系统源码的上传。
为了对 Android 代码质量进行管控,Google 采用 Gerrit 进行 CodeView,并利用 Jenkins 做代码静态检测和自动化验证。
Gerrit 是 Google 为 Android 系统研发量身定制的一套免费开源的代码审核系统。它允许团队成员对代码进行评审、评论和修改,并在代码被合并到主干之前进行审核和验证。Gerrit 提供了一个 Web 界面和一组命令行工具,用于管理代码审查过程。它还支持许多流行的代码托管平台,如 GitHub 和 GitLab。
Gerrit、repo 和 Git 都是与 Git 版本控制系统相关的工具。在使用 Gerrit 进行代码审查时,通常会使用 Git 来管理代码版本,并使用 repo 来管理多个 Git 仓库。
因此,这三个工具通常会一起使用,以帮助团队进行高效的代码开发和管理。
接下来说说我们是如何将本地的 Android 系统源码推送到 Gerrit 上的。
生成 ssh keypair
ssh-keygen -t rsa
输入命令后一路按回车键,直至成功生成 ssh 钥匙对。默认生成的钥匙对会存在于 ~/.ssh 目录中。
其中 id_rsa.pub
中是公钥, id_rsa
是私钥,私钥为了安全必须保证不能泄露,公钥是需要配置到gerrit网站上使用的。
然后我们就可以通过命令查看公钥了:
cat ~/.ssh/id_rsa.pub
拿到公钥后,我们就需要设置将其设置到 Gerrit 网站上,具体步骤为:
`Settings -> SSH Keys -> New SSH key -> 粘贴 ssh 公钥 -> 点击 ADD NEW SSH KEY`
添加完成后,我们可以在终端进行验证:
ssh -p 29418 [email protected]
如果验证正常,在终端会打印如下信息:
**** Welcome to Gerrit Code Review ****
Hi username, you have successfully connected over SSH.
Unfortunately, interactive shells are disabled.
To clone a hosted Git repository, use:
git clone ssh://[email protected]:29418/REPOSITORY_NAME.git
Connection to gerrit.osc.com closed.
Gerrit 配置好后,我们就可以尝试往上面推送一个空的工程了。在终端指执行如下命令:
ssh -p 29418 用户名@gerrit-shengxue.youdao.com gerrit create-project --branch 分支名 --empty-commit 工程名/manifest
该文件是 Android 源码中 Repo 工具的默认清单文件,它定义了 Android 源代码树中包含的所有 Git 仓库及其对应的分支和提交 ID。
在使用 Repo 工具下载 Android 源代码时,会自动下载 default.xml
文件,并根据该文件中定义的 Git 仓库信息来下载和同步所有相关的代码仓库。因此,default.xml 文件是非常重要的,它决定了 Android 源代码树中包含哪些 Git 仓库以及它们的版本信息。
开发者可以根据需要修改该文件,以指定特定版本的 Git 仓库和分支信息,或者添加新的Git仓库。
default.xml
文件一般位于源码目录下的 .repo/manifests/ 目录下,代码如下:
在 default.xml
文件中,remote 标签用于定义 Git 仓库所在的远程服务器信息,而 default 标签用于指定默认的远程服务器和分支信息。
其实我们可以在清单文件中添加多个 remote,这样在 git 仓库操作的时候就可以通过不同的 remote 名字来往不同的远端仓库同步代码。如:
<remote fetch=".." name="remote1" review="http://gerrit-hw.xxxx1.com/"/>
<remote fetch=".." name="remote2" review="http://gerrit-hw.xxxx2.com/"/>
另外,在 default.xml
文件中,每个 project 标签用于定义一个 Git 仓库,并指定它的名称、路径以及其他相关信息。具体来说:
通过使用 name 和 path 属性,default.xml 文件可以准确地指定每个 Git 仓库的名称和本地路径,可以确保repo 工具可以正确地下载和同步Android源码。
了解了 default.xml
文件,我们知道它十分重要,一般来说,Android 会将其上传在一个单独的 manifest 库中,接下来我们需要创建并上传 manifest 库。具体步骤如下:
首先需要先在 Gerrit 上创建 manifest 库。可以手动在 Gerrit 上创建,也可以通过以下命令创建:
ssh -p 29418 用户名@gerrit-xxx.com gerrit create-project --branch 分支名 --empty-commit 工程名/manifest
创建完 manifest 库,我们将 manifest 克隆到本地,执行命令:
git clone -b 分支名 "http://[email protected]/工程名/manifest"
然后把配置文件 default.xml
添加进去,最后再将修改 push 到服务器:
git push origin -f
完成了 manifest 库的创建和上传后,接下来的目标就是创建 Android 源码中的其他库了。
首先我们要知道,Android 源码是由成百上千个 git 库构成的,如 Android 8.1 源码就包含了超过 1000 个 Git 仓库。
所有这些仓库都可以通过 Repo 工具来下载、管理和同步。其中一些仓库是必需的,包括 Android 平台框架和核心应用程序,而其他仓库则是可选的,例如第三方库和驱动程序。因此,想要上传 Android 系统源码到 Gerrit 上,首先就是要先确定所有 Git 仓库的名称。
在 repo 工具中,project.list
文件用于列出当前源码中的所有 Git 仓库。而 project.list
文件一般位于源码目录下的 .repo/ 目录下,它的结构如下:
注意: project.list 文件中不包含 manifests 仓库,因为 manifests 仓库是用于存储 repo 工具的清单文件的库,它不是一个普通的 Android 应用程序或系统组件的 Git 仓库。实际上,manifests 仓库的信息是直接写在 repo 工具的代码中的,而不是通过 project.list 文件来管理。如果想要查看或修改 manifests 仓库的信息,需要直接编辑 repo 工具的代码,而不是修改 project.list 文件。
由于库太多了,所有我们这里使用 Bash 脚本来帮助我们上传。
首先,创建一个 create.sh
文件(create.sh
文件和 project.list
文件放置在同一个目录下),并写代码如下:
#!/bin/bash
# 验证传入的参数是否至少有一个参数
if [ $# -lt 1 ] ; then
echo "usage : ./create.sh project.list";
exit 1;
fi
# 读取传入的参数作为项目列表
project_list=$1
# 提示输入项目名称
echo -n 'input project name:'
read project_name
# 如果项目名称为空,则退出脚本
if [ -z "$project_name" ]; then
echo "project name can not be empty"
exit
fi
# 提示输入分支名称
echo -n "input branch name:"
read branch_name
# 如果分支名称为空,则使用项目名称后加上 _master 作为默认分支名称
if [ -z "$branch_name" ]; then
branch_name="${project_name}_master"
echo "use default branch name:$branch_name"
else
echo "branch name:$branch_name"
fi
# 提示输入帐户名称
echo -n "input account name:"
read user
# 如果帐户名称为空,则退出脚本
if [ -z "$user" ];then
echo "account can not be empty"
exit
fi
# 遍历每个项目名称并创建 Gerrit 项目
for i in `cat ${project_list}`;
do
echo $i
# 使用 Gerrit 命令行工具通过 SSH 创建每个项目,并设置指定的分支名称和空提交
echo "ssh -p 29418 ${user}@gerrit-shengxue.youdao.com gerrit create-project --branch $branch_name --empty-commit ${project_name}/$i"
ssh -p 29418 ${user}@gerrit-shengxue.youdao.com gerrit create-project --branch $branch_name --empty-commit ${project_name}/$i
done
准备就绪后,在终端执行脚本:
./create_projects.sh project.list
脚本会要求输入三个名字,
等待执行完成,可以到 Gerrit 上确认是否创建成功。
创建完所有 Git 仓库后,接下来就需要往仓库里上传源码了,
通过 repo forall
命令,我们可以对所有的仓库进行遍历并执行对应的指令,即:
repo forall -c "对应指令"
首先我们进入到源码根目录下,切换到我们在 Gerrit 上创建的仓库所对应的分支上:
repo forall -c "git checkout test_branch"
将源码合并到 test_branch 分支上,用 rebase 或者 merge 命令都可
repo forall -c "git rebase aosp_branch"
推送所有源码到 Gerrit 的 test_branch 分支上
repo forall -c "git push origin test_branch -f"