vimer linux kernel 爱好者

aosp中repo的使用

2020-01-07

install repo

Android是一个特别大的软件项目,我们只有在git的管理基础上再进行一次封装。 在Ubuntu上安装repo一般有两种方案,一种是源码,不过这种方案我没有成功;第二种方案是直接通过命令apt install repo即可。 link link

初始化一个库

在我的工作场景下是使用这么一个命令的。

repo init

repo init -u ssh://[email protected]:29418/platform/manifest -b zhimo-mr1-dev  --repo-url=ssh://[email protected]:29418/tools/git-repo --reference=/home/local_mirror

这里有很多重点,需要简单地记录下。其实,一个简单的repo是这样的:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

请不要在意URL,这玩意一通百通。如果需要某个特定的 Android 版本列表:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1

因为我们的开发分支是xx,所以不太一样,这一点需要注意。 初始化成功的界面如下:

repo has been initialized in /home/user/src

在上面的第一条命令中,需要关注的就是-b--reference选项,后者是指向了一个本地仓库,这样就能大大减轻服务器的压力,这个参数的作用还可以体现在下载内核源代码时。

和直接从Gerrit服务器下载相比优点如下:

代码下载时间大大缩短,基本上就是直接checkout了。

节省虚拟机磁盘空间,因为git相关的二进制文件都链接到镜像中了

降低Gerrit负载

可以用 -m 参数来选择获取 repository 中的某一个特定的 manifest 文件,如果不具体指定,那么表示为默认的 namifest 文件 (default.xml)

repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml

假设,我的分支是别人已经更改过的,那么,我想使用原生的安卓源代码,怎么办?加个参数:

-m aosp_base/android-10.0.0_r20.xml

情景2;

这里有一个问题,比如我clone aosp代码时指定的是 -b r20,但是,当在开发途中,突然告知要 切换到r25版本(这里的r25只是一个分支名字,实际中可以叫任何一个名字)。那么,我就删库从头下 吗?事实上是不必的,在aosp的root目录下,重新指定分支即可.

repo init -u ssh://[email protected]:29418/platform/manifest -b zhimo-mr1-dev --reference=/home/local_mirror

这里是不会覆盖的,而且,在我的测试的时候,在一个分支上重新下载分支,同步时还会默认使用之前的标志,比如,自动更新:

repo sync -cdj4 --no-tags

当所有的项目切换到新的分支上,这个sync就已经完成了.但是,如果你在本地的代码上有一些改动,则会提示:

Fetching projects: 100% (747/747), done.
art/: discarding 1 commits
bionic/: discarding 1 commits
build/blueprint/: discarding 1 commits
build/make/: discarding 1 commits
build/soong/: discarding 3 commits

你肯定不希望自己辛辛苦苦修改的代码完全丢弃了啊,那么如何更新呢?

那么,如何完成代码的同步更新?

同步

一个标准的命令是:

repo sync

我们用的命令是:

repo sync -cdj4 --no-tags

这样就可以不必下载过多的tag

git push commit

江湖救急,将git push这个命令放在这里以备不时之需。

git push origin HEAD:refs/for/git-repo-branch

在aosp中,进入到每个repo中,前期的操作与正常的git操作是一模一样的,只是在提交 commit的时候,使用上面的命令,后面的repo branch要和相匹配的git repo branch相对应。

应用

使用命令:

du -h --max-depth=1

看一下这个工程的大小:

user@host037-ubuntu-1804:~/src$ du -h --max-depth=1
677M	./.repo
76M	./art
44M	./bionic
15M	./bootable
15M	./build
1.4G	./cts
26M	./dalvik
405M	./developers
132M	./development
1.8G	./device
7.7G	./external
1.9G	./frameworks
185M	./hardware
1.2M	./kernel
84M	./libcore
372K	./libnativehelper
773M	./packages
752K	./pdk
4.5M	./platform_testing
32G	./prebuilts
27M	./sdk
500M	./system
398M	./test
102M	./toolchain
1.7G	./tools
50G	.

一些版本控制的信息在.repo目录下。 需要重点关注下,.repo/目录下manifest.xml文档,它记录了整个项目的构成什么的。

repo info

这个命令提供了一个全局的git库的概述,主要包括各个分支在某个仓库的情况,如下:

vimer@host:~/src/aosp_art/art$ repo info 
Manifest branch: zhimo-aosp
Manifest merge branch: refs/heads/zhimo-aosp-d_art
Manifest groups: all,-notdefault
----------------------------
Project: platform/art
Mount path: /home/vimer/src/aosp_art/art
Current revision: 9e22b01ffc829a3cdf9e66e07d6afd30eb1e3a7e
Local Branches: 5 [vimer_dev, run_test_yuzhen, run_test_0817, assembler_dev, fmv-s_dev]

目录分析

以art为例,与art有关的代码是: 1.art目录 2. libcore目录,包含 jdk相关源代码 3.libnativehelper目录,包含JNI相关代码

  1. frameworks/base/cmds/am、frameworks/base/core、frameworks/base/include目录,包含Zygote相关的源代码。

上一篇 c库-字符串

下一篇 llvm基础知识

Comments

Content