源起
现在很多企业的网络一般都比较快, 但是有的企业却会限速, 如果需要从github和google code上面git clone大的仓库的话, 那么需要耗费的时间是很客观的, 例如从github或者google code, 或者其他托管服务站点获取Android中需要的多个Kernel仓库, 一般一个kernel仓库都有几GB, 如果是100KB/S的话, 那么将需要很长的时间.
与此同时, 不同的Android 版本(AOSP)代码, 他们一般都会依赖许多相同的组件, 甚至获取相同的仓库代码, 仅仅只是branch或者tag不同而已, 例如对于Nexus 7 flo平板而言, 不管是AOSP 4.4 Kitkat还是 5.X Lolipop, 都会去下载flo-kernel这个内核, 他们都remote都是一样的, 唯一不同的是tag使用的不同, 因此如果我们已经获取过Kitkat的代码,那么就可以复用其中的bare repo, 从而达到快速clone.
要了解如何做, 我们需要对AOSP的代码结构非常熟悉, 一般而言, 如果是系统工程师,那么几乎对AOSP的每一个目录都会很熟悉, 对自己需要编译的target的依赖的每一个repo都几乎会心中有数(例如external中的哪些, vendor, device都会用到哪些), 这种情况下, 就可以删除某些仓库的下载, 从而节省时间.
总结起来, 要节省git clone的时间就是从两个方面入手:
- 1. 复用已经clone的bare repo
- 2. 不要clone不需要的repo
repo分析
在实现前面的两点之前, 除了对AOSP的编译, 以及Target的依赖很熟悉外, 我们还需要对google 的 repo工具以及其流程有个基本的熟悉和了解.
repo的执行过程
- 解析传入的args
- checkout下来最新的repo
- 找到manifest的目录
- 解析manifest.xml
- 根据manifest或者其他xml文件调用git clone --bare-repo获取xml中定义的clone repo
- 从.repo/projects中的bare repo根据manifest xml中的projects信息checkout到当前目录
具体查看repo这个python脚本的源码.
下面使用具体例子来讲解.
repo init
repo init -u https://github.com/bluez-android/aosp_platform_manifest.git -b lollipop
这个init调用传入的-u这个用于指定需要下载的manifest的仓库地址:
def _Checkout(cwd, branch, rev,