首页 > Android, 开源技术 > Git和Repo扫盲——如何取得Android源代码

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


Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(repository),许多个工作目录(working copy),而像Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeperMercurialGNU ArchBazaarDarcsSVKMonotone等),每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响

因为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的中文版

分享&收藏:
  • del.icio.us
  • Digg
  • Google Bookmarks
  • Twitter
  • Technorati
  • Facebook
  • LinkedIn
  • 百度收藏
  • 豆瓣
  • 鲜果
  • QQ书签
  • 校内
  • 饭否
  1. 2009年4月29日18:34 | #1

    基本上每次来到你的博客都像刘姥姥进了大观园,知道到处都是好东西,可是自己又不敢动手碰,主要还是不懂,呵呵。

  2. 2009年4月30日10:05 | #2

    其实纯软件的东西怎么弄都没关系
    大不了就是把系统搞暴而已,呵呵

  3. Chocolly
    2009年5月8日09:39 | #3

    这个你也懂!

  4. 2009年5月8日11:26 | #4

    @Chocolly
    不懂可以学啊,呵呵

  5. 漫步
    2009年7月3日17:32 | #5

    通过代理访问,curl出错,但是apt-get 就可以,这是为什么?

  6. 2009年7月4日00:06 | #6

    @漫步
    不是很清楚你的具体环境
    针对这里的操作,可以用浏览器打开repo的路径,另存就可以了

  7. thinkinnight
    2009年7月19日06:43 | #7

    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文档还没来得及看,多谢多谢

  8. thinkinnight
    2009年7月19日07:41 | #8

    使用了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?
    哈,问题好多啊,大家一起研究研究?

  9. 2009年7月20日11:35 | #9

    @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即可,这点在我上面的文章中有提到。

  10. thinkinnight
    2009年7月20日19:43 | #10

    多谢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是使用的什么配置呢?被搞得比较疑惑了。

    真是不好意思,问题一堆,能否推荐一些站点,我自己去看,如果问题太多,而没有时间回答的话,其实邮件列表里面信息也很多,但是比较零碎,还没有专门抽出时间来看掉,如果有专门的网页会好些,谢谢了。

  11. 2009年7月23日00:59 | #11

    @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来驱动了。

    这方面的问题我有接触,尽管问吧,把我问倒了我去讨论组找答案,呵呵

  12. thinkinnight
    2009年7月23日10:49 | #12

    呵呵,首先谢谢William的回答了。那我有问题就放心问了,哈哈。
    你的回答就是我想要了解的答案,看了之后感觉清楚多了。
    不过对于最后一个还有些疑问,我知道emulator是在qemu的基础上搞出来的,相当于虚拟硬件,而通过emulator -kernel等参数,将kernel放入emulator中运行,不过我源码到手后(主线的源码),就直接进行了make,记得emulator也能够启动进入android系统,按照我的想法,那肯定也是通过-kernel参数加上某个kernel的位置来运行的,那这里我使用的kernel是在哪里呢?那既然不是goldfish的kernel,那又是标准的kernel吗?还是MSM的?还是什么的呢?
    谢谢
    哦,还有,是不是可以给你发邮件啊?问题描述起来总是比较多的,在评论里面有时会写很多内容,呵呵。或者两种方式一起交流?

  13. 2009年7月26日22:22 | #13

    @William Hua
    其实我觉得你应用回答说“略懂”
    《赤壁》的老诸总这样回答啊

  14. 2009年7月29日19:09 | #14

    @thinkinnight
    你好,理论上,用标准的kernel也能够用emualtor引导起来
    只是所使用的虚拟设备和goldfish kernel不同而已
    我亲自实践过,确实可以进入系统
    emulator有一个默认的查找kernel的路径,所以如果你的kernel正好在那里的话,不加-kernel参数也没问题(某个环境变量似乎有一样的效果,没实践过,不太记得了:P)

    邮件当然没问题,gtalk也可以,我一般都在线

  15. 2009年11月18日17:41 | #15

    您好!
    我有个问题想向您请教一下:我用repo sync同步完源码后,为什么在system/core/目录下没有mountd子目录?
    谢谢!!

  16. cxz
    2009年12月11日21:38 | #16

    hi,

    我在Windows下用git下载一个Email app的源码

    比如我想下载针对模拟器android-1.6_r2的源码,我看有个tags是android-1.6_r2,如何下载这个版本的源码了?git命令是怎样的了?

    谢谢

  17. 初学者
    2010年3月9日13:50 | #17

    您好!

    我想知道,我该如何开始接触android的更低一点的层,或者开始学习源码?我是不是需要一个linux环境,我是不是该先学习linux。

    谢谢!

    我的基本介绍:
    我对android的API 已经有一定的了解,使用上没有什么问题,我已经做过几个android的实际应用。
    我懂c++,java ,不懂Linux

  18. songyinghao
    2010年5月10日12:10 | #18

    你好
    我按照文中的步骤进行操作
    执行完
    repo sync
    之后

    我等了一天
    并没有在Android目录下看到下载的东西

    请问这是怎么回事

  19. Lazy Cat
    2010年5月26日09:58 | #19

    @songyinghao
    William大虾,对,我也是这种情况,执行
    repo init -u git://android.git.kernel.org/platform/manifest.git 命令后,它只是进行了初始化安装,获取了我的name和email,并没有进行下载;
    而执行repo sync后,看似在搜索下载,可等了一晚上,发现目录里什么也没有! 这是怎么回事,救命阿!

  20. ine
    2010年7月1日10:08 | #20

    @Lazy Cat
    没有下载完,那个目录下是空的。好像是放在那个缓冲里了,我一直在找这个缓冲,谁知道在哪里?

  21. 2010年8月13日20:09 | #21

    @Lazy Cat
    repo init确实只是初始化,repo sync才会下载
    网络不佳时,确实会碰到下了一半短线的情况,只能重试
    或者些个脚本一直try
    下载完了以后会把内容checkout出来这是你才能看到
    而之前,都在.repo目录下

  22. 2010年8月13日20:10 | #22

    @初学者
    先试试把emulator编出来吧
    然后可以改改framework

  23. 2010年8月13日20:10 | #23

    cxz :

    hi,

    我在Windows下用git下载一个Email app的源码

    比如我想下载针对模拟器android-1.6_r2的源码,我看有个tags是android-1.6_r2,如何下载这个版本的源码了?git命令是怎样的了?

    谢谢

    最简单的办法,就是在gitweb上操作,直接下这个snapshot

  1. 2009年9月1日15:22 | #1
  2. 2009年12月17日00:04 | #2
  3. 2009年12月19日00:22 | #3
  4. 2010年2月12日13:16 | #4
  5. 2010年3月19日17:35 | #5