写在前面
repo是相当于一个git的代码管理工具,android源码是由几百个相对比较独立的项目组成,这就相当于几百个git的项目。如果需要对几百个git仓库进行管控,那么就需要用到repo,所以repo就应运而生。
配置Android的源码过程,实际上就是配置repo仓库的过程,配置完仓库之后,就可以在对代码进行chekout(如果是做系统定制开发,repo仓库需要配置在代码服务器,开发人员基于这个服务器进行开发和提交;如果是用于源码阅读,repo仓库可以配置在个人电脑)
repo实际上就是一个用python包裹的多项目的git操作。那么如果需要下载源码,就是配置repo仓库、checkout代码的过程。
创建repo仓库并checkout代码
先创建一个目录并下载repo工具
mkdir ~/bin(创建一个目录,名称可以自定义)
PATH=~/bin:$PATH(把这个目录放到系统环境)
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo(下载repo工具)
chmod a+x ~/bin/repo下载仓库初始包
Android源码的大小在30到40G左右,在代码下载过程中的一些网络问题会导致代码同步失败,所以需要使用初始化包的形式。由于android的源码是google提供的,所以源码的真正路径是在google相应的服务器。但是在国内,很难访问外国网站,所以建议在清华的镜像获取。初始包镜像路径:mirrors.tuna.tsinghua.edu.cn/aosp-monthl…
操作方法如下:
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar#解压
Android源码真正的repo仓库目录
下载下来的初始包,经过解压,使用ls命令,可以看到一个aosp的文件夹。
进入aosp目录,使用ls -a可以看到一个.repo目录,.repo实际就是android的repo仓库。因为下载下来的初始包里面的连接是google的连接,所以我们需要配置为清华的镜像连接。
配置如下:
进入.repo:
.repo$ ls
manifest.xml
project-objects
repo
manifests
project.list
manifests.git
projects只需要将.repo/manifest.xml 把其中的 aosp 这个 remote 的 fetch 改为 https://aosp.tuna.tsinghua.edu.cn/。
然后cd ~bin/repo/aosp/下执行以下命令
repo sync # 正常同步一遍即可得到完整目录到目前为止,就完成了创建repo仓库和checkout Android源码了。
repo目录介绍
这里说到的.repo都可以参照上面的~bin/repo/.repo路径。
.repo目录如下:
.repo
├── manifests # 一个git库,包含default.xml文件,用于描述repo所管理的git库的信息
├── manifests.git # manifest这个git库的实体,manifest/.git目录下的所有文件都会链接到该目录
├── manifest.xml # manifests/default.xml的一个软链接
└── repo # 一个git库,包含repo运行的所有脚本
|__project-objects
|__project.list #是一个文件,里面列出了项目的名称及其相对路径
|__projects 仓库目录和工作目录
仓库目录保存的是历史信息和修改记录,工作目录保存的是当前版本的信息:
manifests: 仓库目录有两份拷贝,一份位于工作目录(.repo/manifests)的.git目录下,另一份独立存放于.repo/manifests.git
repo:仓库目录位于工作目录(.repo/repo)的.git目录下
project:所有被管理git库的仓库目录都是分开存放的,位于.repo/projects目录下。同时,也会保留工作目录的.git,但里面所有的文件都是到.repo的链接。这样,即做到了分开存放,也兼容了在工作目录下的所有git命令。
既然.repo目录下保存了项目的所有信息,所有要拷贝一个项目时,只是需要拷贝这个目录就可以了。repo支持从本地已有的.repo中恢复原有的项目。
项目清单库(.repo/manifests)
AOSP项目清单目录下,有一个default.xml,是一个标准的XML,描述了当前repo管理的所有信息。文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="aosp"
fetch=".."
review="https://android-review.googlesource.com/" />
<default revision="master"
remote="aosp"
sync-j="4" />
<project path="build" name="platform/build" groups="pdk,tradefed" >
<copyfile src="core/root.mk" dest="Makefile" />
</project>
<project path="abi/cpp" name="platform/abi/cpp" groups="pdk" />
<project path="art" name="platform/art" groups="pdk" />
...
<project path="tools/studio/translation" name="platform/tools/studio/translation" groups="notdefault,tools" />
<project path="tools/swt" name="platform/tools/swt" groups="notdefault,tools" />
</manifest>
<remote>:描述了远程仓库的基本信息。name描述的是一个远程仓库的名称,通常我们看到的命名是origin;fetch实际就是远程仓库地址;review描述的是用作code review的server地址
<default>:default标签的定义的属性,将作为<project>标签的默认属性,在<project>标签中,也可以重写这些属性。属性revision表示当前的版本,也就是我们俗称的分支;属性remote描述的是默认使用的远程仓库名称,即<remote>标签中name的属性值;属性sync-j表示在同步远程代码时,并发的任务数量,配置高的机器可以将这个值调大
<project>:每一个repo管理的git库,就是对应到一个<project>标签,path描述的是项目相对于远程仓库URL的路径,同时将作为对应的git库在本地代码的路径; name用于定义项目名称,命名方式采用的是整个项目URL的相对地址。 譬如,AOSP项目的URL为android.googlesource.com/,命名为platform/build的git库,访问的URL就是android.googlesource.com/platform/bu…