全称是Android Open Source Project,它是整个Android源码的开源项目。
官方地址是:https://android.googlesource.com
如果你下载过源代码,那么对下面的这个指令不会陌生
$ repo init -u https://android.googlesource.com/platform/manifest
这是初始化AOSP的分支,默认情况下为Master。
上面指令里边的地址就是AOSP的原始地址,由于Google被墙的缘故,即使连接上VPN速度也不是很快。这时候我们优先使用国内的镜像源,具体镜像源可以参考我前边的文章Android源代码编译笔记(支持5.x及以上版本)。
平常情况下,我们初始化之后就开始sync
,然后就是编译,刷机或运行模拟器。
虽然我们也下载编译且运行了AOSP,但是对它的组成还是不清楚。所以,我就边研究边记笔记,从代码上了解AOSP。
只写文字太单调了,配一张Android官网的经典Android系统框架图:
由于Android的系统版本众多,这里以5.1.1版本(分支android-5.1.1_r15
,即for Nexus Player)为例来分析一下AOSP的组成(方法对于其它版本是一样的)。
那么它对应的初始化地址就是
https://android.googlesource.com/platform/manifest -b android-5.1.1_r15
这里边仓库所在的服务器是https://android.googlesource.com/
,而platform/manifest
是仓库的路径,而android-5.1.1_r15
则是这个仓库的一个分支。
你如果直接访问上面的路径,会发现它其实是一个git仓库,而clone正是使用这个地址来进行,即
git clone https://android.googlesource.com/platform/manifest
将其clone下来并且切换到android-5.1.1_r15
分支后(默认是Master分支)你会发现该仓库只有一个文件 - default.xml
。
切换命令
git checkout -b android-5.1.1_r15 origin/android-5.1.1_r15
就像Java的main
方法一样,这个文件便是整个AOSP的入口。
该文件有500+行,是这个样子
<manifest>
<remote name="aosp"
fetch=".." />
<default revision="refs/tags/android-5.1.1_r15"
remote="aosp"
sync-j="4" />
<project path="build" name="platform/build" groups="pdk,tradefed" >
<copyfile src="core/root.mk" dest="Makefile" />
project>
<project path="abi/cpp" name="platform/abi/cpp" groups="pdk" />
<project path="art" name="platform/art" groups="pdk" />
<project path="bionic" name="platform/bionic" groups="pdk" />
...
<project path="tools/tradefederation" name="platform/tools/tradefederation" groups="notdefault,tradefed" />
manifest>
我们可以看到该文件由3种标签组成:remote
, default
和project
。我们逐个来分析一下。
remote
<remote name="aosp"
fetch=".." />
这是定义一个源,名字是aosp
,fetch则是它的地址,这里用..
表示相对路径的上一层目录。
我们在前边初始化时使用的命令是
https://android.googlesource.com/platform/manifest
表示我们当前所在的目录是https://android.googlesource.com/platform/
,而再加上..
,那么aosp
所在的目录是https://android.googlesource.com/
。
所以,转换一下,实际的地址是
<remote name="aosp"
fetch="https://android.googlesource.com/" />
project
<project path="art" name="platform/art" groups="pdk" />
表示一个git仓库,其中
project
没有这个属性,则表示default
分组。默认情况下,同步的是除notdefault
分组外的所有分组。所以上面的标签的含义是从https://android.googlesource.com/platform/art
地址同步git仓库到本地,放在当前目录的art
文件夹下。
你可以将文件中的
project
与你下载好的aosp代码对比一下,看是不是这样。
在这个版本中,整个AOSP包含有501个project。
在这里需要特别说明一下第1个project
<project path="build" name="platform/build" groups="pdk,tradefed" >
<copyfile src="core/root.mk" dest="Makefile" />
project>
它除了下载仓库之外,还有一个子任务copyfile
。
即下载完成后,将本地的build/core/root.mk
文件复制到源代码根目录,并重命名为Makefile
。
大家也可以对比一下,这两个文件的内容是不是一模一样。
default
<default revision="refs/tags/android-5.1.1_r15"
remote="aosp"
sync-j="4" />
我们知道了project
指的是远端的git仓库后,default
就好理解了。它有3个属性:
aosp
AOSP话题太大了,细讲的话一本书也说不完。这篇文章仅仅从代码(仓库)的角度了解一下AOSP是什么或者说它的组成结构。
到这里,我们也很容易明白了:
AOSP是由500多个git组成的一个超级git仓库集合。