【Android源码】Gerrit上传Android源码

news/2024/7/8 15:07:16 标签: android, elasticsearch, 大数据

关于Gerrit的安装参考下面链接
【Android源码】Gerrit安装

要实现上传Android源码,需要经历以下几步:

  1. 下载Android代码
  2. 创建源码仓库
  3. 创建manifests仓库
  4. 上传源码
  5. 其他电脑下载源码

要证明Gerrit中的源码真实可用,肯定是以其他人能真正共享到代码才行,所以第5步必不可少。

1. 下载Android源码

可以参考我之前写的文章,【Android源码】AOSP下载
下面我会大致过一遍(切记,电脑的环境很重要,我以前在虚拟机上下载,问题挺多的,很烦人,后来在一台Ubuntu的服务器上下载,Android12,147G,157万个文件夹,很快就下载完了,配置很硬)

  1. 安装git
sudo apt install git
  1. 安装依赖
# 更新系统软件包
sudo apt update

# 安装必要的软件包
sudo apt install -y \
    git \
    curl \
    wget \
    unzip \
    python3 \
    openjdk-11-jdk \
    build-essential \
    zlib1g-dev \
    gcc-multilib \
    g++-multilib \
    libc6-dev-i386 \
    lib32ncurses5-dev \
    x11proto-core-dev \
    libx11-dev \
    libgl1-mesa-dev \
    libxml2-utils \
    xsltproc \
    unzip \
    ccache \
    libssl-dev \
    bc
  1. 配置环境变量
# 编辑 .bashrc 或 .zshrc
nano ~/.bashrc  # 或者 nano ~/.zshrc

# 添加以下环境变量
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
export USE_CCACHE=1

# 使环境变量生效
source ~/.bashrc  # 或者 source ~/.zshrc
# 验证java
java --version
  1. 设置git身份,添加自己的邮箱和姓名
git config --global user.email "xxx@qq.com"
git config --global user.name "xxx"
  1. 验证Python3:// 至少要安装3.6以上
python3 --version
  1. 创建bin,并加入到PATH中
mkdir ~/bin
PATH=~/bin:$PATH
  1. 下载repo并设置权限
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
# curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
# 验证repo的安装
repo --version
  1. 初始化Android版本
# https://android.googlesource.com/platform/manifest
mkdir android12
cd android12
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.1.0_r1
  1. 下载
repo sync

...
Checking out: 100%(1052/1052), done in 10m4.919s
repo sync has finished successfully.

完成标准:1568660项 147.7G大小

2. 创建Android源码仓库

步骤:创建一个create.sh脚本,复制出project.list(来源android12源码:~/android12/.repo/project.list)

  1. ~/android12/.repo/project.list 这里包含了所有源码的路径
art
bionic
bootable/libbootloader
bootable/recovery
build/bazel
build/blueprint
build/make
build/pesto
build/soong
compatibility/cdd
cts
dalvik
developers/build
developers/demos
developers/samples/android
development
device/amlogic/yukawa
...
  1. 随便找一个路径创建create.sh脚本
cd ~/gerrit
touch create.sh
nano create.sh

脚本内容如下:

#!/bin/bash
 
USER_NAME="admin"
 
SERVER_IP="10.168.10.140"
 
SERVER_PORT="29418"
 
# PROJECT_DIR="aosp"
# 路径要改成自己的ssh的路径
SSH_KEY="/home/xx/.ssh/id_rsa"

eval $(ssh-agent -s)
ssh-add $SSH_KEY

echo "SSH_AGENT_PID=$SSH_AGENT_PID"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK"

function creatEmptyGerritProject()
 
{
 
for i in `cat project.list`;
 
do
 
echo $i
 
echo "ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project --empty-commit $i"
 
ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project --empty-commit $i
 
done
 
}
 
creatEmptyGerritProject
kill $SSH_AGENT_PID

解释一下:

  • USER_NAME : 这里是来源自己Gerrit创建的账户,我的是admin。
  • SERVER_IP: 是Gerrit服务器地址。
  • PROJECT_DIR : 很多人提供的脚本设置了项目名,我发现在,google原生代码里并没有设置这个。所以我也删掉了(其实是后面吃亏了,才重新修改了这个地方)
  • SSH_KEY: 可以设置,也可以不用设置,因为我一开始代码无法连接Gerrit服务器,是由于SSH的问题,所以做了设置,如果你本身不存在这个问题,可以删掉如下脚本
# 路径要改成自己的ssh的路径
SSH_KEY="/home/xx/.ssh/id_rsa"

eval $(ssh-agent -s)
ssh-add $SSH_KEY
  • cat project.list:将project.list和放入同一路径下执行脚本。
  • ssh -p $SERVER_PORT $USER_NAME@$SERVER_IP gerrit create-project --empty-commit $i 这句是核心脚本,其实就是将project.list中的路径一条条取出来,然后创建Gerrit仓库。
  • 最后运行sudo ./create.sh启动脚本,等待创建成功就行。
  • 成功标志是:在Gerrit Web中能看到创建了上百个仓库。

3. 创建manifests仓库

第2步创建了所有关于源码的仓库。但是,那是上千个仓库,如果我们其他电脑需要下载这些仓库,不可能单独每个都去git clone一次。所以需要创建manifests仓库,统一管理所有的库。

cd ~/gerrit
# 创建manifests仓库
$ ssh -p 29418 admin@10.168.10.140 gerrit create-project --empty-commit aosp/manifests
# 创建成功可以在Gerrit服务器中找到这个仓库
# 然后下拉aosp/manifests代码
$ git clone ssh://admin@10.168.10.140:29418/aosp/manifests

通过上面几步,可以看到创建了一个manifests文件夹。

  • 复制~/android12/.repo/manifests/default.xml 到 manifests路径下

  • 修改default.xml

    • 一定需要修改default.xml文件,因为这份default.xml是Google原生提供的,但我们Gerrit服务器的路径并不是一致的,分支也不一样(网上有很多关于default.xml的上传,但并没有人说过要改,要怎么改,我没找到)。

    • tag的修改,默认的如下

      <default revision="refs/tags/android-12.1.0_r1"   remote="aosp"  sync-j="4" />
      

      我并没有创建"refs/tags/android-12.1.0_r1"的tag,所以我改成了master

    • default.xml中包含大量的

      <project path="art" name="platform/art" groups="pdk" />
      

      后面全局下载的是时候,其实我们并没有这种"platform/art",包含"platform"路径的仓库。所以需要全局删掉name中的platform

    • 还有配置中包含name和path不一致的情况,全部按照path的内容,将name修改掉,可以自己写一个python脚本来实现(不会的自行百度)。

  • 最后提交代码

git add .
git commit -m "add default.xml"
git push origin master

最后验证:可以通过查看Gerrit Web上的提交日志, 也可以自己把代码拉取下来看看就知道了。

4. 上传源码

这一步就到了上传~/android12中的所有源码了。
创建uploadAosp.sh脚本

cd ~/android12
touch uploadAosp.sh

内容如下

#!/bin/bash
 
USER_NAME="admin"
 
SERVER_IP="10.168.10.140"
 
SERVER_PORT="29418"
 
#PROJECT_DIR="aosp"

echo "SSH_AGENT_PID=$SSH_AGENT_PID"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK"

function pushGerritProject()
 
{
 
file="./.repo/project.list"
 
lines=`cat $file | wc -l`
 
for ((i=1;i<=$lines;i++))
 
do
 
line=`awk 'NR=="'$i'"{print $0}' $file`
 
cd $line
 
echo `pwd`
 
rm -rf .git

git init
 
git remote add origin ssh://$USER_NAME@$SERVER_IP:$SERVER_PORT/$line.git
 
git pull origin master
 
git add -A .
 
git commit -am "init commit"
 
git push origin master
 
cd -
 
done
 
}
 
pushGerritProject
  • 如果在上传的过程中遇到权限问题,可能是因为Gerrit SSH导致的,按照第二步新增ssh-add的代码
  • 正常的日志很清楚的,自己一看就知道,出错的话,也会很明显的提示,解决错误就好了。
  • 成功截图
    在这里插入图片描述
  • 我看了下,android12的文件情况(2209660项,176.7GB大小),这还是没有编译的情况,所以做这事之前,一定要考虑清楚自己电脑的情况

5. 其他电脑下载源码

以前都是通过repo cync在google的Gerrit服务器上下载代码,这步就是通过我们自己的Gerrit服务器来下载Android12的源码了。
准备一台Ubuntu20的系统,可以是虚拟机。首先登录到Gerrit Web端,可以通过ip访问,创建一个自己本地的账户,我的是mygerrit。

  1. 首先要创建这台Ubuntu系统的ssh key
ssh-keygen -t rsa -b 4096 -C "demo@163.com"

邮箱改成自己的。
2. 复制~/.ssh/id_rsa.pub中的内容,并导入到Gerrit–>Setting—>SSH Keys中
3. 验证是否导入成功

ssh -p 29418 mygerrit@10.168.10.140

# 输出如下内容表示成功
  ****    Welcome to Gerrit Code Review    ****

  Hi hmanvm, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://hmanvm@10.168.10.140:29418/REPOSITORY_NAME.git

Connection to 10.168.10.140 closed.

我遇到的问题,基本上是ssh没设置成功,导致没有拉取代码的权限,还有就是第三步中的default.xml配置出问题,导致耽搁时间了。有时需要ssh-add id_rsa来将ssh导入进去。
4. 拉取Gerrit中的源码

mkdir ~/android12
cd ~/android12
# 初始化manifests库, 第三步创建的manifests库这里用到了
repo init -u ssh://mygerrit@10.168.10.140:29418/aosp/manifests
# 最后同步
repo sync

剩下的就是等待了。


http://www.niftyadmin.cn/n/5537373.html

相关文章

Linux环境下快速部署Spring Boot应用:高效命令组合实践

概要&#xff1a; 本文旨在介绍一种高效的Linux命令组合&#xff0c;用于简化Spring Boot项目的部署与管理流程。通过结合使用nohup、java -jar、输出重定向以及进程管理命令&#xff0c;我们能够实现Spring Boot应用的快速后台启动及便捷的进程控制&#xff0c;尤其适合于自动…

前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)

简介 ONLYOFFICE 文档 是一个开源办公套件&#xff0c;包括文本文档、电子表格、演示文稿和可填写表单的编辑器。 它提供以下功能&#xff1a; 创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单&#xff1b; 与其他队友实时协作处理文件。 基于这个控件&#xff0c;…

tapd 与国内外主流的8大项目管理软件大对比

对比Tapd与8大项目管理工具&#xff1a;PingCode、Worktile、Redmine、Teambition、广联达、Jira、禅道、飞书。 Tapd 是腾讯推出的一款敏捷开发管理工具&#xff0c;特别适合那些需要高效协作和快速迭代的敏捷开发团队。它支持多种敏捷方法论&#xff0c;包括Scrum和Kanban&am…

Android C++系列:JNI 调用时缓存字段和方法 ID

在 JNI 去调用 Java 的方法和访问字段时&#xff0c;最先要做的操作就是获得对应的类以及对应的方法 id。 通常我们通过 FindClass 、GetFieldID、GetMethodID 去找到对应的信息也是耗时操作&#xff0c;如果方法被频繁调用&#xff08;特别是像音视频处理时循环的调用JNI方法…

三、数据库系统(考点篇)

1、三级模式一两级映像 内模式&#xff1a;管理如何存储物理的 数据 &#xff0c;对数据的存储方式、优化、存放等。 模式&#xff1a;又称为概念模式&#xff0c; 就是我们通常使用的表这个级别 &#xff0c;根据应用、需求将物理数据划分成一 张张表。 外模式&#xff1a;…

模拟5亿年自然进化史,全新蛋白质大模型ESM3诞生!前Meta老将力作LeCun转赞

模拟5亿年自然进化史&#xff0c;全新蛋白质大模型ESM3诞生&#xff01;前Meta老将力作LeCun转赞。 能抗衡AlphaFold 3的生命科学大模型终于出现了。初创公司Evolutionary Scale AI发布了他们最新的98B参数蛋白质语言模型ESM3。不仅支持序列、结构、功能的all-to-all推理&#…

强化学习的数学原理:蒙特卡洛学习

概述 实际上将之前 policy iteration 当中基于模型的部分只要替换掉不需要模型的部分&#xff0c;就得到了本节课的蒙特卡洛的算法&#xff1b;另外在本门课当中将 value iteration 和 policy iteration 统称为 model-based reinforcement learning&#xff0c;更准确的说应该…

如何通过KB知识库系统实现内部知识的管理

“Baklib 通过构建KB知识库系统实现内部知识的管理&#xff0c;构建 CMS 系统实现网站内容管理&#xff0c;构建 DAM 实现对原子化数字内容的管理。” Baklib 从多个维度和深度实现对数字内容的管理。 CMS 系统 CMS 系统(Content Management System 内容管理系统)是一种帮助用…