William Hua的Blog

2009-04-29

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

Filed under: Android,开源技术 — 标签:, , , , , — William Hua @ 10:43


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

40 条评论 »

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

    评论 by 月夜 — 2009-04-29 @ 18:34

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

    评论 by William Hua — 2009-04-30 @ 10:05

  3. 这个你也懂!

    评论 by Chocolly — 2009-05-08 @ 09:39

  4. @Chocolly
    不懂可以学啊,呵呵

    评论 by William Hua — 2009-05-08 @ 11:26

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

    评论 by 漫步 — 2009-07-03 @ 17:32

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

    评论 by William Hua — 2009-07-04 @ 00:06

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

    评论 by thinkinnight — 2009-07-19 @ 06:43

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

    评论 by thinkinnight — 2009-07-19 @ 07:41

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

    评论 by William Hua — 2009-07-20 @ 11:35

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

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

    评论 by thinkinnight — 2009-07-20 @ 19:43

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

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

    评论 by William Hua — 2009-07-23 @ 00:59

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

    评论 by thinkinnight — 2009-07-23 @ 10:49

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

    评论 by chocolly — 2009-07-26 @ 22:22

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

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

    评论 by William Hua — 2009-07-29 @ 19:09

  15. [...] 本文转自William Hua的Blog,原文在此。 [...]

    Pingback by Android开发环境的建立(3) « suny的世界 — 2009-09-01 @ 15:22

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

    评论 by 弹 — 2009-11-18 @ 17:41

  17. hi,

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

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

    谢谢

    评论 by cxz — 2009-12-11 @ 21:38

  18. [...] 本文转自William Hua的Blog,原文在此。 [...]

    Pingback by Android开发环境的建立(3)——获取Android源代码【转贴】 » 不然你要我怎么样 — 2009-12-17 @ 00:04

  19. [...] 请先参考我的另一篇文章如何取得Android源代码,确保正确地拿到了Android kernel/common项目的 Goldfish分支(该分支用于构建运行在emulator上的系统内核,而主线则是用于构建运行在实际设备上的内核代码)上的内核代码。另外,需要提 醒一下大家的是Android的sourcecode目前只能在Linux或者Mac OS下做交叉编译编译,Windows并没有被支持,以下将以Ubuntu 8.04为Host OS来说明。 [...]

    Pingback by 【转贴】如何构建Android 1.5 Linux内核映像 » 不然你要我怎么样 — 2009-12-19 @ 00:22

  20. [...] 转自:http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/ [...]

    Pingback by tek-life » [转]Git和Repo扫盲——如何取得Android源代码 — 2010-02-12 @ 13:16

  21. 您好!

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

    谢谢!

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

    评论 by 初学者 — 2010-03-09 @ 13:50

  22. [...] 请先参考如何取得Android源代码一文,通过repo来取得当前最新的android主线代码(或者拿名为android-SDK-1.5_r1的tag也无妨)。 [...]

    Pingback by 【转贴】如何构建Android 1.5系统映像 » 不然你要我怎么样 — 2010-03-19 @ 17:35

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

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

    请问这是怎么回事

    评论 by songyinghao — 2010-05-10 @ 12:10

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

    评论 by Lazy Cat — 2010-05-26 @ 09:58

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

    评论 by ine — 2010-07-01 @ 10:08

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

    评论 by William Hua — 2010-08-13 @ 20:09

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

    评论 by William Hua — 2010-08-13 @ 20:10

  28. cxz :

    hi,

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

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

    谢谢

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

    评论 by William Hua — 2010-08-13 @ 20:10

  29. [...] 第二部分 推荐的文章:http://www.mcuol.com/Edu/264/29748.htm && http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/ [...]

    Pingback by 猫左羽右 » 从零开始学习Android之环境配置 — 2010-10-16 @ 02:02

  30. 你好,william看了你上面的文章介绍如何使用git下载Android的源码,让我在以前的基础上又多了一些更多的了解。在这里我想请教你一个问题,我下载的源码都已经编译完了(kernel 2.6.29),但是下载道板子上的时候没有任何图像出现,用串口调试也仅仅是出现一些启动信息。因为没有触摸屏,所以想把它通过TV输出,在网上查了一下方法,有人说是改framebuffer里的Fb,让其指到TV的设备上,这样就可以了,也有人说在Android中修改js文件,两种方法我都试了,但是没有成功。现在是找不到思路了,请问这种情况,我应该怎么去修改,让其出现在显示屏上,谢谢!

    评论 by bevis — 2010-12-03 @ 09:58

  31. [...] 转自:http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/ [...]

    Pingback by [转]如何取得Android源代码 | Hi Java! — 2010-12-04 @ 15:32

  32. [...] 请先参考我的另一篇文章如何取得Android源代码,确保正确地拿到了Androidkernel/common项目的Goldfish分支(该分支用于构建运行在emulator上的系统内核,而主线则是用于构建运行在实际设备上的内核代码)上的内核代码。另外,需要提醒一下大家的是Android的sourcecode目前只能在Linux或者Mac OS下做交叉编译编译,Windows并没有被支持,以下将以Ubuntu 8.04为Host OS来说明。 [...]

    Pingback by » Blog Archive » 如何构建Android 1.5 Linux内核映像 — 2011-01-07 @ 03:20

  33. [...] 源文档 <http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/&gt; [...]

    Pingback by [转]Git和Repo扫盲——如何取得Android源代码 | { yeah : 必须哒 } — 2011-01-27 @ 11:48

  34. [...] —————————————– 参考资料:Git和Repo扫盲——如何取得Android源代码 [...]

    Pingback by Launcher源码初探_How Android » How Android — 2011-03-02 @ 00:07

  35. 楼主神人,膜拜。

    评论 by rickystudio — 2011-03-18 @ 20:29

  36. 在windows下用git+脚本下载成了,但源码很乱,分析目录估计都得很长时间。目前还没有编译,在寻找 platforms 中的android.jar 源码.

    评论 by Mr.TianShu — 2011-05-24 @ 21:19

  37. “如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.get的代码,那就先进入到common目录,然后用下面的命令:”

    kernel/common.get笔误,应该为kernel/common.git

    评论 by tek-life — 2011-05-26 @ 16:06

  38. @tek-life
    多谢指正!

    评论 by William Hua — 2011-07-04 @ 09:27

  39. 主要来复习下repo。。。

    评论 by walfred — 2011-07-04 @ 14:16

  40. 第三步 初始化没有多长时间的
    关键是在同步 repo sync需要花很多时间的

    评论 by walfred — 2011-07-04 @ 14:20

这篇文章上的评论的 RSS feed TrackBack URL

留下评论

Powered by WordPress