阅读android源码,除了使用源码网站 Android Code search
之外,还可以将源码下载到本地方便搜索查看,下面讲一讲下载步骤。
主要步骤
首先需要下载repo工具。reop是以Git为基础构建的代码库管理工具,repo不是要取代git,而是为了在android环境中更轻松的使用git。
下载repo完成后,使用repo init来初始化文件夹,确定要下载的代码分支等信息。最后使用repo sync命令同步代码。
1. 下载repo
执行一下命令,下载repo工具,并确保它可执行
curl storage.googleapis.com/git-repo-do... > ~/bin/repo
chmod a+x ~/bin/repo
下载的这个repo实际是一段可执行的 Python 脚本,可以将其放在路径中的任何位置。使用文本文件打开repo可以看到里面的脚本。
2. 初始化repo客户端
这一步主要是做一些必要的初始化,确定要下载的源代码分支。
创建源码文件夹
下载的源码放在哪里?需要一个文件夹。
创建一个准备存放系统源码的文件夹
mkdir androidsyscode
cd androidsyscode
配置git
使用真实姓名和电子邮件地址配置 Git。要使用 Gerrit 代码审核工具,需要一个与已注册的 Google 帐号关联的电子邮件地址。确保这是可以接收邮件的有效地址。在此处提供的姓名将显示在提交的代码的提供方信息中。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
执行repo init
进入创好的文件夹中(如上面的androidsyscode)
这个步骤目的做一些初始化工作,并确定要下载的源码的分支。
init 后面需要指定一个清单网址,这个网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置
执行命令
repo init -u android.googlesource.com/platform/ma...
表示要拉取的是master分支代码。
如果要其他分支的代码要在后面加上-b和分支名称,如:
repo init -u android.googlesource.com/platform/ma... -b android-4.0.1_r1
其中-u 代表:指定一个url,从这个url中获取清单代码库。即这个清单代码库中包含了要下载的代码的各种信息。
-b:指定修订版本,即要下载的是后面参数指定的分支库(如android-4.0.1_r1)
这个分支名称android-4.0.1_r1从哪里来?怎么知道要下载是分支名称。事实上通过直接打开 android.googlesource.com/platform/ma... 网址就能找到,打开后可以看到里面有很多分支
在这里可以找到你想下载的分支名称。
事实上这个android.googlesource.com/platform/ma... 是个git库。你可以通过:
git clone android.googlesource.com/platform/ma...
将它下载到本地,然后通过git branch -r 等git命令操作可以看都有很多远程分支,这些分支就是你需要的分支名称。和网页打开看到的一样。
在这个manifest库中,你能找到所有android管理的库,分支等信息。
初始化成功后,工作目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下。
3. 下载源码 repo sync
执行完成repo init后就可以使用repo sync下载源码了。
这条命名目的是下载需要的代码到本地。
执行以下命令,开始下载:
repo sync
如果在未使用任何参数的情况下运行 repo sync,则该命令会同步所有项目的文件。
运行 repo sync 后,将出现以下情况:
1)如果目标项目从未同步过,则 repo sync 相当于 git clone。远程代码库中的所有分支都会复制到本地项目目录中。
2)如果目标项目以前同步过,则 repo sync 相当于:
git remote update
git rebase origin/branch
其中 branch 是本地项目目录中当前已检出的分支。如果本地分支没有在跟踪远程代码库中的分支,则项目不会发生任何同步。
通过repo help sync 命令可以了解sync的详细说明,其中有一些重要选项:
-c:仅获取服务器中的当前清单分支
-f:即使某个项目同步失败,也继续同步其他项目
-jthreadcount:将同步操作拆分成多个线程,以更快地完成。确保不会使计算机超负荷运行为其他任务预留一些 CPU。如需查看可用 CPU 的数量,请先运行:nproc --all
例:-j4 表示拆分成4个线程。
repo sync后面还可以跟可选参数[project-list]
repo sync [project-list]
这个[project-list]表示你想同步的项目列表。默认不填写是所有项目。命名加上这个项目名称,可以加快下载速度,你不需要的项目不会下载
project-list到底写的是什么?可以参考源码工作目录(即你执行repo init的目录)
下面 .repo/project.list 文件。打开这文件里面列举的是所有的项目名称。
这些项目名称代表什么,可以查看 .repo/manifests文件夹下的default.xml文件,这个文件描述了项目路径等信息。
运行repo sync此命令时,时间较久,需要耐心等待,成功完成后即可在本地查看系统源码。
4. mac 系统下载处理
由于Mac的文件系统默认不区分大小写,所以我们需要建一个磁盘映象。这个磁盘映像的目的是将android系统源码下载到这个磁盘映像中。防止因为文件大小写的问题出现错误。所以在mac系统中我们需要在磁盘映像中建工作目录然后再执行repo init命令。
在系统中找到磁盘工具
打开文件菜单选择空白映像
填写磁盘信息
输入磁盘名称,大小和格式。格式要选对,要区分大小写。然后保存即可。
创建好磁盘映像后,即可进入其中,执行repo init命令,以及repo sync命令来下载源码了。
下载的源码会保存在这个磁盘映像中,下次重启电脑还需要重新挂载,否则进不了源码目录。
下面看看如何挂载
挂载磁盘
挂载磁盘可以使用命令:
hdiutil attach ~/AndroidDisk.dmg -mountpoint /Volumes/android
即把刚才生成的映像文件,如AndroidDisk.dmg挂载到目录/Volumes/android
Google的官网上推荐把这行加到~/.bash_profile里,这样以后每次用mountAndroid命令就行了。
mount the android file image function mountAndroid { hdiutil attach ~/AndroidDisk.dmg -mountpoint /Volumes/android; }
(记住路径和文件名的正确书写)
以后每次在命令行输入:mountAndroid 就挂载了之前生成的映像了
5. repo 说明
repo 详细说明可以参考官方文档:
如果对某个repo 命令不了解,可以执行命令:
repo help command
如,repo help sync
这个help命令输出对应命令的详细说明
6. 遇到的坑
执行repo 时遇到了一个错误:
env: python: No such file or directory
检查系统确实安装了python,但是安装的python3。于是打开repo文件,发现头部显示的是
#!/usr/bin/env python
将其改为
#!/usr/bin/env python3
并保存,问题解决。
repo命令实际上就是个python脚本文件,所以可以使用任何文本工具打开修改。。
参考:
source.android.com/source/down...