认识repo

任何一个学习Android开发的开发者如果想要深入学习Android,一定要看Android源码,网上关于下载Android源码的教程有很多,如果你已经翻墙了,你可以直接参考Google官网的教程或者老罗最新出的教程,如果你还没有翻墙,你可以用清华大学的Android源码镜像

我一开始没有用他们所推荐的Ubuntu下载,而是在听闻Windows 10专业版里内置了一个Ubuntu子系统以后,我尝试用Windows 10下载源码,但遇到很多问题,在网上又搜不到相应的解释,而且repo这个东西搞得我很混乱,完全不知道是个啥,后来公司内部也开始切换到repo和git了,才渐渐搞懂两者的关系,也“成功”在Windows 10 下载了Android 源码。

Git作为一个版本控制工具,功能很强大,新建分支,切换分支都很快,小团队用Git就能很好地管理好了,但如果是Android系统如此庞大的工程呢,我们知道全套Android源码是很大很大的,目录结构也很复杂,如果直接将其init成一个Git库,简直是灾难,也不符合解耦的要求。 
Android Source 
要知道Git是无法将整个库中间的某个目录单独clone出来的,这样如果我只是负责frameworks的,但我下代码的时候却得把整个都下下来。

那怎么办呢,很简单,分模块嘛,比如就把根目录下的每个目录当做一个单独的Git库,这样开发只要专注于自己的模块就行,其他模块的代码就当看不见。嗯,很好,问题似乎解决了。但这样还不够,你总得有一套完整的Android 源码才能编译出一个版本吧,你怎么知道这个大版本里包含了哪个库呢,有人会说,为啥要记录呢,不就这么些库嘛,依次取出来不就行了。或许对于我们工作中接触到的工程规模来说,这样是够了,但Android,都已经7.1.1了,相比较一开始,Android本身也发生了翻天覆地的变化,有些模块在演进过程中可能就渐渐被抛弃了,这个时候我们就需要一个定义一个文件去记录每一个版本的Android到底用了哪些库。

以上其实就是repo的原理和所解决的问题,让我们来看看repo到底是做的。

当你完成了repo init以后,你会在你的目录下发现一个.repo的隐藏目录,进到.repo/manifest/中,打开default.xml,这就是之前所说的用来记录一个版本中需要哪些库的文件。下图是android-4.0.1_r1版本所对应的default.xml文件:

repo/default.xml

仔细看看,是不是很熟悉?但Google分模块分的更细一些,并不是简单地将一级目录直接就划成一个模块,比如external,它是以二级目录划分的,而device目录下划分得更细一些。而revision定义的则是对应库的对应分支。

好了,这个文件看完关闭之后,我们在.repo/manifest/目录下运行git branch -a来看看。

这里写图片描述

这下就明了了吧,这个manifest目录本身其实也是一个git库,一个Android版本对应一个分支,其中的default.xml就记录着这个版本所需要的库,repo工具再根据这个文件去把取各个库的对应分支并最终组合起来。

总结一下,Git管理单独的模块,而repo管理所有的Git库,将多个Git库组合在一起,形成一个完整的大版本。

用Windows 10下载源码遇到的问题

下载到最后会出现如下的错误提示:

# ~/repo init -u https://android.googlesource.com/platform/manifest
# ~/repo sync
...
Fetching projects: 100% (512/512), done.
Syncing work tree:  59% (303/512)  error: unable to create file tests/P_str_escape/str\\escape.rs (No such file or directory)
Traceback (most recent call last):
  File "/root/android/.repo/repo/main.py", line 531, in <module>
    _Main(sys.argv[1:])
  File "/root/android/.repo/repo/main.py", line 507, in _Main
    result = repo._Run(argv) or 0
  File "/root/android/.repo/repo/main.py", line 180, in _Run
    result = cmd.Execute(copts, cargs)
  File "/root/android/.repo/repo/subcmds/sync.py", line 769, in Execute
    project.Sync_LocalHalf(syncbuf, force_sync=opt.force_sync)
  File "/root/android/.repo/repo/project.py", line 1247, in Sync_LocalHalf
    self._InitWorkTree(force_sync=force_sync)
  File "/root/android/.repo/repo/project.py", line 2393, in _InitWorkTree
    raise GitError("cannot initialize work tree")
error.GitError: cannot initialize work tree
root@localhost:~/android#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

这个问题已经确认是Windows 10 bash的一个问题,不过我估计一时半会儿是没辙了。原因其实很简单,仔细看看“tests/P_str_escape/str\\escape.rs”这个文件名,你在Windows系统下见过这么奇怪的文件名吗?因为Windows系统根本就不支持这样的文件名,\/:*?”<>|这几个字符在Windows下是不能出现在文件名当中的。连接中还提供了一种方法,在/home/usr_name/目录下下载源码,但我C盘没那么大空间了,我就没试,有条件的同学可以试试。

难道在Windows下我就下不了源码了吗?!其实放宽点条件,还是可以的,只要你不需要编译系统,只是想看看源码,还是可以的。既然那几个文件创建不了,那我不下了还不行嘛,不能因小失大嘛。

首先运行repo sync --trace,这样下次出错的时候你就能知道出错的那几个文件属于哪个模块,然后到.repo/manifest/default.xml中将对应的模块删掉就好了,这样一个约等于完整的源码就能下到本地了,只是用作研究,看一看是没有问题的。可以看到我去掉了三个模块,这三个模块暂时和我研究的方向还没有关系,就先这样吧 _(:з」∠)_

diff

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值