如何使用repo下载部分Android源码

最近打算重新折腾下Android源码,由于网速慢和Mac的SSD磁盘空间不太够的原因,打算只下载部分想研究的Android源码看看,但又想保留android源码本身的结构,因此不能直接clone github上的android源码项目。目前android 7.0源码完整下载估计在40G左右,如果翻墙下载网速比较慢,可能几天都下不好,也就不要折腾了。

在分析了.repo目录下面的文件之后,我找到一个简单的方法,可以只下载部分源码的git项目,现在安卓源码一共由500多个git项目组成,一个人想了解全部源码基本上是不可能的,只能研究下重要的或者是工作涉及的部分。

由于是Mac上,需要按照官方的说明做些准备工作,具体参考http://source.android.com/source/initializing.html#setting-up-a-mac-os-x-build-environment
,具体做法如下:

1
2
# 创建一个大小写敏感的磁盘镜像文件
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg

修改~/.bash_profile,加入2个函数

1
2
3
4
# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }

运行

1
2
3
source ~/.bash_profile
mountAndroid #挂载磁盘镜像到/Volumes/android
cd /Volumes/android

因为本文不涉及到编译源码,所以编译环境相关但步骤就不介绍了,官方文档挺详细的。
下面介绍下repo吧

  1. repo是什么?

repo是一种代码版本管理工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库。

  1. 为什么要用repo?

因为Android源码引用了很多开源项目,每一个子项目都是一个Git仓库,每个Git仓库都有很多分支版本,为了方便统一管理各个子项目的Git仓库,需要一个上层工具批量进行处理,因此repo诞生。

最后重点到了,看下.repo/manifests/default.xml文件,内容大概如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

<remote name="aosp"
fetch=".." />
<default revision="refs/tags/android-7.0.0_r14"
remote="aosp"
sync-j="4" />

<project path="build" name="platform/build" groups="pdk,tradefed" >
<copyfile src="core/root.mk" dest="Makefile" />
</project>
<project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />
<project path="build/kati" name="platform/build/kati" groups="pdk,tradefed" />
<!-- <project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" >
<linkfile src="root.bp" dest="Android.bp" />
<linkfile src="bootstrap.bash" dest="bootstrap.bash" />
</project>
<project path="abi/cpp" name="platform/abi/cpp" groups="pdk" />
<project path="art" name="platform/art" groups="pdk" /> -->
......
</manifest>

看到了吧,只要把不需要下载的源码project注释掉,然后运行repo sync就可以只下载没有被注释掉的项目了。当然这种办法只能用了研究源码,如果要编译源码,只下载一部分肯定是不行的。
repo sync后的项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
tree -L 1
.
├── CleanSpec.mk
├── blueprint
├── buildspec.mk.default
├── core
├── envsetup.sh
├── kati
├── libs
├── target
└── tools

cd kati
repo info .
Manifest branch: refs/tags/android-7.0.0_r14
Manifest merge branch: refs/heads/android-7.0.0_r14
Manifest groups: all,-notdefault
----------------------------
Project: platform/build/kati
Mount path: /Volumes/android/N/build/kati
Current revision: refs/tags/android-7.0.0_r14
Local Branches: 0

这样我们就实现了用repo sync只下载想要的安卓源码项目的目的。

本文独立博客地址

Contents
,