【Android】系统源码的上传

前言

在之前的文章中,写了如何下载系统源码:【Android】系统源码下载及编译

这篇文章就写写系统源码的上传。

为了对 Android 代码质量进行管控,Google 采用 Gerrit 进行 CodeView,并利用 Jenkins 做代码静态检测和自动化验证。

Gerrit 是 Google 为 Android 系统研发量身定制的一套免费开源的代码审核系统。它允许团队成员对代码进行评审、评论和修改,并在代码被合并到主干之前进行审核和验证。Gerrit 提供了一个 Web 界面和一组命令行工具,用于管理代码审查过程。它还支持许多流行的代码托管平台,如 GitHub 和 GitLab。

Git、Gerrit、Repo

  • Gerrit 是一个基于 Git 的代码审查工具,它可以帮助团队进行代码审查和管理。
  • Repo 是 Google 开源的多仓库管理工具,它可以帮助在一个项目中管理多个 Git 仓库。
  • Git 是一种分布式版本控制系统,它可以帮助团队管理代码版本、协作开发和追踪代码变更

Gerrit、repo 和 Git 都是与 Git 版本控制系统相关的工具。在使用 Gerrit 进行代码审查时,通常会使用 Git 来管理代码版本,并使用 repo 来管理多个 Git 仓库。

因此,这三个工具通常会一起使用,以帮助团队进行高效的代码开发和管理。

接下来说说我们是如何将本地的 Android 系统源码推送到 Gerrit 上的。

配置gerrit公钥

生成 ssh keypair

ssh-keygen -t rsa

输入命令后一路按回车键,直至成功生成 ssh 钥匙对。默认生成的钥匙对会存在于 ~/.ssh 目录中。

其中 id_rsa.pub 中是公钥, id_rsa 是私钥,私钥为了安全必须保证不能泄露,公钥是需要配置到gerrit网站上使用的。

然后我们就可以通过命令查看公钥了:

扫描二维码关注公众号,回复: 14821306 查看本文章
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 源码

default.xml 配置文件

该文件是 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 标签:用于定义一个远程服务器,包括服务器的名称、URL 和 fetch 属性
  • default 标签:用于指定默认的远程服务器和分支信息,包括 remote 和 revision 属性。remote 属性指定了默认的远程服务器名称,而 revision 属性指定了默认的分支或提交ID

其实我们可以在清单文件中添加多个 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 属性:指定 Git 仓库的名称
  • path 属性:指定 Git 仓库在本地文件系统中的路径,当使用 repo 工具下载和同步 Android 源码时,该属性指定了仓库将存储在本地哪个目录中
  • 其他属性:除了 name 和 path 属性,project 标签还可以包含其他属性,例如 revision 属性,用于指定 Git 仓库的提交 ID 或分支名称,以及 remote 属性,用于指定 Git 仓库所在的远程服务器

通过使用 name 和 path 属性,default.xml 文件可以准确地指定每个 Git 仓库的名称和本地路径,可以确保repo 工具可以正确地下载和同步Android源码。

创建并上传 manifest 库

了解了 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

使用 Bash 脚本批量上传 Git 库

完成了 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

脚本会要求输入三个名字,

  • 工程名 — 与前面创建 manifest 时的工程名一致
  • 默认分支名 — 与前面创建 manifest 时的分支名一致
  • 用户名 — 用于创建仓库的用户

等待执行完成,可以到 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"

猜你喜欢

转载自blog.csdn.net/yang553566463/article/details/129959660
今日推荐