【Android源码】Gerrit上传Android源码

关于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.mfbz.cn/a/774324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++(第五天----多继承、虚继承、虚函数、虚表)

一、继承对象的内存空间 构造函数调用顺序&#xff0c;先调用父类&#xff0c;再调用子类 #include<iostream>using namespace std;//基类 父类 class Base{ public: //公有权限 类的外部 类的内部 Base(){cout<<"Base()"<<endl;}Base(int …

笔记本电脑升级实战手册[2]:清灰换硅脂

文章目录 前言&#xff1a;一、开盖拆卸二、清灰指南1. 电脑内部清灰2. 风扇清灰3. 清理散热铜管 三、更换硅脂总结&#xff1a; 前言&#xff1a; 这是笔记本电脑升级实战手册的第二篇文章&#xff0c;本篇主要是对电脑进行清灰换硅脂的处理的分享&#xff0c;使用电脑是华硕…

晨持绪电商:大学毕业生投资抖音网店怎么样

在这个数字化飞速发展的时代&#xff0c;传统的职业路径已不再是唯一的选择。对于充满激情和创意的大学毕业生来说&#xff0c;投资抖音网店或许是一个颇具前景的选择。 抖音作为一个流量巨大的社交媒体平台&#xff0c;为年轻人提供了一个展示自我、推广产品的绝佳舞台。与传统…

创新引领,构筑产业新高地

在数字经济的浪潮中&#xff0c;成都树莓集团以创新驱动为核心&#xff0c;通过整合行业资源、优化服务、培养数字产业人才等措施&#xff0c;致力于打造产业高地&#xff0c;推动地方经济的高质量发展。 一、创新驱动&#xff0c;引领产业发展 1、引入新技术、新模式&#xf…

平安养老险宿州中心支公司积极参与“78奋力前行”集体健步行活动

7月3日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;宿州中心支公司组织员工参加由宿州市保险行业协会2024年“78奋力前行”线下集体健步行活动。 平安养老险宿州中心支公司员工高举公司旗帜&#xff0c;与同业伙伴一起出发&#xff0…

maven设置阿里云镜像源(加速)

一、settings.xml介绍 settings.xml是maven的全局配置文件&#xff0c;maven的配置文件存在三个地方 项目中的pom.xml&#xff0c;这个是pom.xml所在项目的局部配置文件用户配置&#xff1a;${user.home}/.m2/settings.xml全局配置&#xff1a;${M2_HOME}/conf/settings.xml 优…

数据库国产化之路(一)

数据库国产化之路(一) 1、前言&#xff1a;适配海量数据库过程中的一些记录&#xff0c;备忘用 2、海量数据库基于的pg版本&#xff0c;查看PG_VERSION文件为9.2。 3、MySQL中的IF函数替代&#xff0c;一开始的方案是从网上找了个if函数&#xff0c;后来发现CASE WHEN其实能完成…

手把手教你生成一幅好看的AI图片

很多人看到别人用SD生成出来的图片感到非常的羡慕&#xff0c;因为即使给了他们最好的SD软件&#xff0c;他们也是词穷&#xff0c;不知道该如何去描述要生成的图片。 别急&#xff0c;这篇文章会一步步的教会你怎么才能生成一个好看的AI图片。 跟着我&#xff0c;别走丢。 …

iptables与firewalld

iptables Linux上常用的防火墙软件 1、 防火墙的策略 防火墙策略一般分为两种&#xff0c;一种叫通策略&#xff0c;一种叫堵策略&#xff0c;通策略&#xff0c;默认门是关着的&#xff0c;必须要定义谁能进。堵策略则是&#xff0c;大门是洞开的&#xff0c;但是你必须有身…

从数据到智能,英智私有大模型助力企业实现数智化发展

在数字化时代&#xff0c;数据已经成为企业最重要的资源。如何将这些数据转化为实际的业务价值&#xff0c;是每个企业面临的重要课题。英智利用业界领先的清洗、训练和微调技术&#xff0c;对企业数据进行深度挖掘和分析&#xff0c;定制符合企业业务场景的私有大模型&#xf…

2024年7月最佳免费天气API接口推荐

在我们的日常生活中&#xff0c;天气扮演着一个至关重要的角色&#xff0c;它影响着我们的情绪、健康、日常安排和商业决策。无论是计划一次户外活动、安排农作物种植&#xff0c;还是确保旅行安全&#xff0c;天气信息的准确性和及时性至关重要。随着技术的进步&#xff0c;天…

格式化代码 | 美化JSON、SQL

一、格式化JSON数据 打开Postman&#xff0c;将json数据粘到里面&#xff0c;点击Beautify即可美化代码。 二、格式化SQL 打开Navicat&#xff0c;新建查询&#xff0c;将sql粘进去点击”美化sql“即可。 三、浏览器 在线格式化 使用浏览器上的在线格式化网址。例如&…

android应用的持续构建CI(五)-- 应用管理

一、ER设计 渠道&#xff1a;应用发布的渠道&#xff0c;To B的话&#xff0c;可能是学校、租户等&#xff1b;To C的话&#xff0c;渠道则是不同厂商的应用市场。审核&#xff1a;jenkins构建应用完成后&#xff0c;管理后台生成应用的审核记录。 下面是每个实体详细的字段&a…

聚合支付系统主要分账方案及API分析

1 常见分账场景介绍 分账一般分为线下场景分账和线上场景分账&#xff0c;分账API分为微信&#xff0c;支付宝或其他第三方支付公司、银行。今天我们主要探讨微信、支付宝线上和线下场景分账流程。 微信分账API分为收付通和线下服务商分账&#xff0c;支付宝分账分为互联网平…

AVL许可证状态查询

Adams软件介绍 ADAMS是MSC公司 (现属于海克斯康) 旗下的一款专业的机械系统动力学自动分析软件&#xff0c;可以帮助工程师和设计师快速分析和优化机械系统的运动和力学性能。ADAMS支持多种机械系统的建模和仿真&#xff0c;如汽车、机器人、飞机、机械臂等等&#xff0c;可以模…

Butterfly主题文章标题改成转动小风车

效果 标题级别不同小风车颜色不同&#xff0c;鼠标移入会有转动变慢及变色效果。 新建css 建议在/source下创建诸如img/css/js等文件夹&#xff0c;存放文章或网站用的素材&#xff0c;分门别类后续也方便维护。 Hexo打包的时候&#xff0c;会自动把/source下的文件&#…

直饮水也要烧开饮用吗?

某天上班&#xff0c;同事跟我说他的爸爸喝瓶装水都要烧开了后再喝。 这种行为震惊了小编。 好像很多上一辈的人有种执念&#xff0c;那就是水一定要烧开了喝。 不仅是因为习惯&#xff0c;也是他们的观念已经根深蒂固&#xff0c;认为烧开后的水喝起来才健康。 其实水不一…

MUNIK解读ISO26262--什么是DFA

我们在学习功能安全过程中&#xff0c;经常会听到很多安全分析方法&#xff0c;有我们熟知的FMEA(Failure Modes Effects Analysis)和FTA(Fault Tree Analysis)还有功能安全产品设计中几乎绕不开的FMEDA(Failure Modes Effects and Diagnostic Analysis)&#xff0c;相比于它们…

通过代理服务器连接 huggingface下载数据集或模型

有些huggingface的数据集或者模型在镜像网站("https://hf-mirror.com"&#xff09;上不存在&#xff0c;因此在国内只能通过代理服务器来下载&#xff0c;下面是下载的代码示例&#xff1a; import os os.environ["http_proxy"] "http://127.0.0.1:…

Pyqt5中的按钮在播放后出现大小变化应该怎么做

有的时候开发的Pyqt5程序总是会在预览后发现按钮的大小和设计的不一样大&#xff0c;主要原因就是因为按钮的“水平策略”和“垂直策略”的设置导致的&#xff0c;具体如下&#xff1a; 设置为fixed&#xff0c;就是固定的&#xff0c;不要设置为其他的。 fixed的功能如下 部…