Git和Repo扫盲——如何取得Android源代码

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(repository),许多个工作目录(working copy),而像Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。
因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。
这几天William为了拿Android最新的sourcecode,学习了一下git和repo的一些基本操作,整理了一个如何取得Android代码的How-To,今天把他贴上来。
1、Git的安装
在Ubuntu 8.04上安装git只要设定了正确的更新源,然后使用apt-get就可以了,有什么依赖问题,就让它自己解决吧。其中cURL是一个利用URL语法在命令行下工作的文件传输工具,会在后面安装Repo的时候用到。
sudo apt-get install git-core curl
2、安装Repo
首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中
接下来通过cURL来下载Repo脚本,保存到~/bin/repo文件中
curl http://android.git.kernel.org/repo >~/bin/repo
别忘了给repo可执行权限
chmod a+x ~/bin/repo
3、初始化版本库
如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。
先建立一个目录,比如~/android,进去以后用repo init命令即可。
repo init -u git://android.git.kernel.org/platform/manifest.git
这个过程会持续很长的时间(至少可以好好睡一觉),具体要多少时间就取决于网络条件了
最后会看到 repo initialized in /android这样的提示,就说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode。
如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如:
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
另一种情况是,我们只需要某一个project的代码,比如kernel/common,就不需要repo了,直接用Git即可。
git clone git://android.git.kernel.org/kernel/common.git
这也需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。
如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.get的代码,那就先进入到common目录,然后用下面的命令:
git checkout origin/android-goldfish-2.6.27 -b goldfish
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。我们可以通过git branch来列出本地的所有分支。
4、同步版本库
使用epo sync命令,我们把整个Android代码树做同步到本地,同样,我们可以用类似
repo sync project1 project2 …
这样的命令来同步某几个项目
如果是同步Android中的单个项目,只要在项目目录下执行简单的
git pull
即可。
5、通过GitWeb下载代码
另外,如果只是需要主线上某个项目的代码,也可以通过GitWeb下载,在shortlog利用关键字来搜索特定的版本,或者找几个比较新的tag来下载还是很容易的。
Git最初是为Linux内核开发而设计,所以对其他平台的支持并不好,尤其是Windows平台,必须要有Cygwin才可以。现在,得益于msysgit项目,我们已经可以不需要Cygwin而使用Git了。另外,Git Extensions是一个非常好用的Windows Shell扩展,它能与资源管理器紧密集成,甚至提供了Visual Studio插件。它的官方网站上有一分不错的说明文档,感兴趣的朋友可以看一看。
至于Git的参考文档,我推荐Git Magic,这里还有一个Git Magic的中文版。














基本上每次来到你的博客都像刘姥姥进了大观园,知道到处都是好东西,可是自己又不敢动手碰,主要还是不懂,呵呵。
其实纯软件的东西怎么弄都没关系
大不了就是把系统搞暴而已,呵呵
这个你也懂!
@Chocolly
不懂可以学啊,呵呵
通过代理访问,curl出错,但是apt-get 就可以,这是为什么?
@漫步
不是很清楚你的具体环境
针对这里的操作,可以用浏览器打开repo的路径,另存就可以了
Hello,昨天遇到一个问题,我在下载好的android源码的kernel目录下做了一些编译工作,但是没有成功,我以为是不是最新源码的问题,于是执行repo sync,希望重新获得一套新的源码,但是由于我的kernel目录下做了相关的操作,系统就提示我需要将这些操作进行提交才可以,我当然不希望提交了,只是本地的一些实验而已。
于是,干脆就将kernel目录全部删除,想这样总可以了吧,但是问题一下子来了。反正就是不能下载到kernel了。
试了很多方法,包括直接mkdir kernel,将以前备份好的kernel再次拷贝回去,通通不行。
最后,将备份好的kernel拷贝回去后,可以repo sync了,但是发现最终repo sync的结果是将kernel整个目录删除了,而且再次repo sync,还是说是完整的,简直晕掉了。
然后又做了一个新的目录,将repo init -u git://android.git.kernel.org/platform/manifest.git和repo sync重新做了一遍,下了我一个晚上啊一个晚上。。。今天早上起来检查,还是没有kernel目录,其他几个目录都有,不清楚到底git是什么原理,怎么检查,因为以前使用svn,似乎还是比较方便,这个就不太知道怎么搞了。
在这里看到git clone git://android.git.kernel.org/kernel/common.git这个命令,搞过来试一试,现在还在下载中,不知道这个能不能搞定,我可不想因为这个重装系统~
William,如果你知道上面我出现的情况是什么原因,能否告知一二,现在在整源码,git文档还没来得及看,多谢多谢
使用了git clone git://android.git.kernel.org/kernel/common.git之后,下载了一堆东西,看来是kernel,但是很奇怪,目录名使用的是common,让我一开始没有找到
而且目录下,我要找的arch/arm/mach-goldfish并没有出现,去http://android.git.kernel.org/发现有四个kernel相关的git文件,这四个是否都需要下呢?
还有问题就是,我能否将common改名为kernel?
哈,问题好多啊,大家一起研究研究?
@thinkinnight
你好,抱歉今天才回复,看来你是蛮着急的
使用git clone git://android.git.kernel.org/kernel/common.git下载下来的目录名是common是正常的,因为在git里它的项目名就叫common。
Android代码树中有四个和kernel相关的项目,包括common.git、experimental.git、msm.git以及omap.git,其中msm.git和omap.git看名字就知道是为高通的MSM系列和TI的OMAP西类SOC专门修改的kernel版本,experimental.git为实验性项目,所以一般我们都是拿common.git。
最后,如果你要找arch/arm/mach-goldfish(即你需要的是带有goldfish版本的kernel),在执行git clone git://android.git.kernel.org/kernel/common.git拿到common.git的代码后在本地用
git checkout origin/android-goldfish-2.6.27 -b goldfish 切换一下branch即可,这点在我上面的文章中有提到。
多谢William你的回答,呵呵,在做事上我喜欢一口气做下去,遇到哪个block住的地方,就感觉有些着急了,大概。尤其是做android,多件事情一起在做,发现没有时间研究git,找到你这么一个比较好的介绍的地方,又是中文,就来求助了,呵呵。
我主要是看到有文章写到最新的内核源码已经到了2.6.29,所以对你文章里面使用git checkout origin/android-goldfish-2.6.27 -b goldfish来得到goldfish这个分支有些疑惑,我也猜想是通过这个得到goldfish分支的,但是有不少疑问在里面。
1. 我使用git clone git://android.git.kernel.org/kernel/common.git得到的内核代码看,还是取得的是2.6.27的,是我取得有问题,还是现在的确是2.6.27的内核代码?
2. git checkout origin/android-goldfish-2.6.27 -b goldfish是否说明goldfish就是基于2.6.27的内核的呢?因为以前似乎是2.6.25的内核,现在是升级过来,这个关系是怎样的呢?
3. git checkout origin/android-goldfish-2.6.27 -b goldfish是创建了一个branch,我按照这个做,的确是得到了mach-goldfish,但是以前我没有这么做,也一样编译出了emulator,按照以前参考的一些文章的说法,goldfish是针对emulator做的一个ARMV5的架构修改,那原本没有goldfish,make出来可以运行的emulator使用的kernel是使用的什么配置呢?被搞得比较疑惑了。
真是不好意思,问题一堆,能否推荐一些站点,我自己去看,如果问题太多,而没有时间回答的话,其实邮件列表里面信息也很多,但是比较零碎,还没有专门抽出时间来看掉,如果有专门的网页会好些,谢谢了。
@thinkinnight
你好,
1、你取到的代码没有问题,当前common.git中的主线还是2.6.27,29是开发分支
2、goldfish有基于2.6.27的版本,也有基于更新的2.6.29的版本,25和23都是很早以前了。这么说吧,goldfish内核基本上只是针对Android模拟器添加了相应虚拟设备的驱动而已,所以只要有2.6.27的标准内核,就会有2.6.27的goldfish内核,29也一样。
3、这条命令是把本地的git版本库切换到goldfish分支(而不是创建)。至于编译emulator,这和kernel没有实质的联系,emulator是google在qemu的基础上添加了特有的goldfish虚拟设备并给target-arm添加了一些新的指令集而来的,它的编译与kernel无关。emulator运行起来以后,会载入你所编出来的kernel(通过-kernel参数),如果你用的不是goldfish的kernel,这些新添加的虚拟设备就没有driver来驱动了。
这方面的问题我有接触,尽管问吧,把我问倒了我去讨论组找答案,呵呵
呵呵,首先谢谢William的回答了。那我有问题就放心问了,哈哈。
你的回答就是我想要了解的答案,看了之后感觉清楚多了。
不过对于最后一个还有些疑问,我知道emulator是在qemu的基础上搞出来的,相当于虚拟硬件,而通过emulator -kernel等参数,将kernel放入emulator中运行,不过我源码到手后(主线的源码),就直接进行了make,记得emulator也能够启动进入android系统,按照我的想法,那肯定也是通过-kernel参数加上某个kernel的位置来运行的,那这里我使用的kernel是在哪里呢?那既然不是goldfish的kernel,那又是标准的kernel吗?还是MSM的?还是什么的呢?
谢谢
哦,还有,是不是可以给你发邮件啊?问题描述起来总是比较多的,在评论里面有时会写很多内容,呵呵。或者两种方式一起交流?
@William Hua
其实我觉得你应用回答说“略懂”
《赤壁》的老诸总这样回答啊
@thinkinnight
你好,理论上,用标准的kernel也能够用emualtor引导起来
只是所使用的虚拟设备和goldfish kernel不同而已
我亲自实践过,确实可以进入系统
emulator有一个默认的查找kernel的路径,所以如果你的kernel正好在那里的话,不加-kernel参数也没问题(某个环境变量似乎有一样的效果,没实践过,不太记得了:P)
邮件当然没问题,gtalk也可以,我一般都在线
您好!
我有个问题想向您请教一下:我用repo sync同步完源码后,为什么在system/core/目录下没有mountd子目录?
谢谢!!
hi,
我在Windows下用git下载一个Email app的源码
比如我想下载针对模拟器android-1.6_r2的源码,我看有个tags是android-1.6_r2,如何下载这个版本的源码了?git命令是怎样的了?
谢谢
您好!
我想知道,我该如何开始接触android的更低一点的层,或者开始学习源码?我是不是需要一个linux环境,我是不是该先学习linux。
谢谢!
我的基本介绍:
我对android的API 已经有一定的了解,使用上没有什么问题,我已经做过几个android的实际应用。
我懂c++,java ,不懂Linux
你好
我按照文中的步骤进行操作
执行完
repo sync
之后
我等了一天
并没有在Android目录下看到下载的东西
请问这是怎么回事
@songyinghao
William大虾,对,我也是这种情况,执行
repo init -u git://android.git.kernel.org/platform/manifest.git 命令后,它只是进行了初始化安装,获取了我的name和email,并没有进行下载;
而执行repo sync后,看似在搜索下载,可等了一晚上,发现目录里什么也没有! 这是怎么回事,救命阿!
@Lazy Cat
没有下载完,那个目录下是空的。好像是放在那个缓冲里了,我一直在找这个缓冲,谁知道在哪里?