(连载)Android系统源码分析--如何下载和阅读Android源码



> ** 这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析 [github连载地址](https://github.com/foxleezh/AOSP)**


## 前言


阅读Android源码的好处有很多,可以加深我们对系统的了解,可以参考牛人优雅的代码实现,可以从根本上找出一些bug的原因...我们应该庆幸Android是开源的,所有的功能都可以看到实现,所有的bug都能追踪溯源。


我想大家或多或少听说过Android源码开源项目,即AOSP(Android Open Source Project) ,有些人可能还不知道如何下载AOSP,有些人虽然下载下来了,但是面对庞大的Android源码项目又望而却步,不知道从哪儿下手。


所以本文将从以上两个问题出发,具体讲解如何下载和阅读Android系统源码。


## 一、如何下载AOSP
源码下载是我们分析源码的开始,Android源码可以全量下载,也可以单个下载,我们先介绍全量下载
### 1.1 全量下载
[官方文档](https://source.android.com/source/downloading) ,只要按照上面一步步做就可以了,但是由于需要,国内无法直接访问,而整个Android项目源码巨大,即便是后下载也很慢,所以还是使用国内镜像比较好。


我推荐清华大学开源镜像,[地址](https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/) ,这上面也是有完整的教程,我就不复制粘贴了,但是有一点要注意,你一定要备一个比较大的磁盘,至少60个G吧,还不算后期编译的。


我们分析源码其实是不需要全部代码的,因为AOSP不仅包括系统源码,还有些工具代码,如aapt,adb等,这些我们根本不需要,而且即便是系统源码,也不是所有我们都需要看,如果真的全部看,你这辈子都看不完,所以我还是推荐大家单个下载。


### 1.2 单个下载
[官方地址]( https://android.googlesource.com/) ,比如我们要下载platform/frameworks/base/目录下的代码,我们可以git clone https://android.googlesource.com/platform/frameworks/base ,不过这个还是会遇到的问题,当然我们也可以用镜像。


[镜像地址]( https://aosp.tuna.tsinghua.edu.cn/) ,比如我们要下载platform/frameworks/base/目录,就用git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base ,如果你带宽够的话,一般几分钟就可以下载好你想要的单个源码了。


如果你想下载单个文件,或者搜索文件名及代码,可以访问 http://androidxref.com/ ,这里有部分Android的源码


### 1.3 AOSP目录结构


先上一张图,整个Android项目的架构图
![](https://user-gold-cdn.xitu.io/2017/10/22/2a01f36d8e89311aea19ff5e849b1334)


我们都知道Android系统从上到下大致分为这四层,所以我们以这四层为基础,讲解下AOSP的目录结构:


- 第一层:应用程序层(applications)对应根目录下 [platform/packages/apps](https://android.googlesource.com/platform/packages/apps)
- 第二层:应用程序框架层(application framework)对应根目录下的 [platform/frameworks](https://android.googlesource.com/platform/frameworks)
- 第三层:运行库层包括运行库(libraries)和android运行时环境(android runtime)
 - libraries对应目录很多,其中libc库对应的是 [platform/bionic](https://android.googlesource.com/platform/bionic)
 - android运行时环境,Core Libraries 对应根目录下的 [platform/libcore](https://android.googlesource.com/platform/libcore),Dalvik Virtual Machine 对应根目录下的 [platform/dalvik](https://android.googlesource.com/platform/dalvik) ,不过现在已经是ART了,所以目录是 [platform/art](https://android.googlesource.com/platform/art)
- 第四层:Linux内核层对应根目录下的 [kernel](https://android.googlesource.com/kernel),每一个目录对应了一个kernel的版本,因为Android要兼容各种芯片,下面罗列一下:
 - goldfish 项目包含适用于所模拟的平台的内核源代码。
 - msm 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作使用 Qualcomm MSM 芯片组的起点。
 - omap 项目用于 PandaBoard 和 Galaxy Nexus,可用作使用 TI OMAP 芯片组的起点。
 - samsung 项目用于 Nexus S,可用作使用 Samsung Hummingbird 芯片组的起点。
 - tegra 项目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作使用 NVIDIA Tegra 芯片组的起点。
 - exynos 项目包含适用于 Nexus 10 的内核源代码,可用作使用 Samsung Exynos 芯片组的起点。
 - x86_64 项目包含适用于 Nexus Player 的内核源代码,可用作使用 Intel x86_64 芯片组的起点。
 - hikey-linaro 项目用于 HiKey 参考板,可用作使用 HiSilicon 620 芯片组的起点。
- 第三层和第四层中间还有个硬件抽象层(HAL)对应根目录下的 [platform/hardware](https://android.googlesource.com/platform/hardware)




目前我下载的目录如下:


git clone https://aosp.tuna.tsinghua.edu.cn/platform/packages/apps/Launcher2

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base

git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/native

git clone https://aosp.tuna.tsinghua.edu.cn/platform/system/core

git clone https://aosp.tuna.tsinghua.edu.cn/platform/bionic

git clone https://aosp.tuna.tsinghua.edu.cn/platform/libcore

git clone https://aosp.tuna.tsinghua.edu.cn/platform/art

git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm



## 二、如何阅读AOSP


当我们把源码下载下来之后,会感到茫然无措,因为AOSP的源码实在是太多了,这里我们需要明确一些问题:


* 要阅读哪些源码
* 阅读源码的顺序和方式
* 用什么工具来阅读


下面我将从这三个问题一一展开


### 2.1 要阅读哪些源码


这个问题是比较个性化的,因为不同的人从事着不同的工作,有的人从事应用开发,可能对Java层东西感兴趣;有的人从事Framework开发,可能对Framework层感兴趣;有的从事硬件开发,可能对底层实现感兴趣。


这个都因人而异,但是有一点,不能盲目地毫无目的地看源码,因为这样的话最终你会淹没在AOSP的大海里,看了一年半截啥都看了,却又感觉都没看透,别人问你源码的东西,都能说个一二,但是一往深了说,就不知所以了。


所以对于AOSP源码,不在于多,而在于精,你不要试图把所有的源码都看懂,你只要对自己感兴趣的那部分深入研究就可以,因为即便是Google工程师也不可能把AOSP全部读完。


对于我而言,我是从事应用层开发的,我主要会了解以下几个方面的源码:


* Android系统启动流程,应用启动流程,四大组件启动流程,这将列入系统启动篇
* 系统常用服务ActivityManagerService,WindowManagerService等,这将列入系统服务篇
* 通信机制,主要是Binder和Handler,这将列入通信篇
* 进程和线程的创建,运行,销毁,这将列入进程篇
* View的绘制和显示流程,事件分发机制,这将列入图形绘制篇
* Android虚拟机ART运行机制,类加载机制,Java注解,Java反射,这将列入虚拟机篇
* Android对于Java集合的优化算法,这将列入Java基础篇


### 2.2 阅读源码的顺序和方式


#### 2.2.1 阅读顺序
读源码是一个日积月累的过程,不可能一蹴而就,当我们列出自己感兴趣的源码后,我们需要制定一个阅读计划,先读什么再读什么。这个也是因人而异,根据自己的兴趣来就是,你最想读什么,那就排前面。


我一直在说兴趣,因为兴趣是最好的老师,只有你对一样东西感兴趣了,才会有动力去学,去研究,才会不觉得累,如果一开始就去啃一些你不感兴趣的东西,到头来也是乏味不专注的,理解的程度也是不深,而且很有可能失去信心,最后放弃阅读。


当然,如果你对好几样东西都感兴趣,那就有一些原则了:


* 事物都讲究先后,就像树木扎根大地一样,先有大地,才有树木,基础的东西先看
* 相互有关联的东西一起看,不要一会儿看系统启动,突然又去看事件分发什么的


#### 2.2.2 阅读方式
Android系统涵盖的范围很广,从上层的应用程序,到Framework,再到Libraries以至硬件,从Java层到C++,就像一座几十层的大厦一样,每层都有楼梯,也有电梯,我们需要做的就是在大厦里上下穿梭。


当我们阅读某一个知识点源码的时候,不同的知识点有不同的阅读方式,有些适合从下往上读,比如系统启动流程,我是从事件开始的地方开始读,从init.cpp开始,然后到zygote进程,到Java虚拟机,最后到Luncher;


有些适合从上往下读,比如Activity的启动,我是从startActivity方法开始读,然后到ActivityThread,然后到ActivityManagerService;


有些适合两头从中间读,比如Binder,我是从Java层看到C++层,但是看到驱动那儿看不动了,然后就从接收Binder的地方往回看,最后在两端集中在驱动的地方前后对比,才将Binder看通。


这里还是有个好的方式,就是从事件触发的地方开始看是比较合适的。


### 2.3 用什么工具来阅读


Android 源码阅读神器当然是Source Insight 
![](https://user-gold-cdn.xitu.io/2017/10/22/a019c246abe07588b268a6cd5121abe4)


Source Insight的好处:


* 支持方法跳转,类跳转,并且对C++支持很好
* 支持文件搜索,java,c++,xml都支持,并且支持内容搜索
* 支持一键导入,随时配置路径
* 而且最重要的,导入文件数多的时候不卡


下面我讲讲如何使用Source Insight
#### 2.3.1 下载安装Source Insight


下载地址 http://download.csdn.net/download/foxlee1991/9882553 ,我还专门配置了一个跟Android Studio一样的Darcula主题,下载地址 http://download.csdn.net/download/foxlee1991/9882535


#### 2.3.2 导入AOSP源码


我目前还没有下载完整的AOSP源码,只是先下载了几个重要的源码。打开Source Insight,选择Project -> New Project,取个名字比如叫AOSP,点击OK


![](https://user-gold-cdn.xitu.io/2017/10/22/20c7c0c82f101c3cb4774520d1c00f12)


选择你要查看的源码目录,点击OK


![](https://user-gold-cdn.xitu.io/2017/10/22/31cc58c01f677c51031112fa153443a7)


选择需要将哪些目录下的源码导入,点击Add Tree


![](https://user-gold-cdn.xitu.io/2017/10/22/ec0b3797043ae23c16130d54699bc63a)




导入成功后会有很多文件列在下方,点击Close


![](https://user-gold-cdn.xitu.io/2017/10/22/ac5852168aeced2ce3f1336b162d1c6d)




#### 2.3.3查看源码
现在进入项目还是一片空白,需要把工具栏打开,然后就可以看源码了


![](https://user-gold-cdn.xitu.io/2017/10/22/f0a9f669f2cc03443fbe6c8b48fc5992)




左边是方法和成员变量搜索,右边Project File是搜索类名,Project Symbol是内容搜索


![](https://user-gold-cdn.xitu.io/2017/10/22/e7b87f4d05760aff0b165b4db7589289)




还有一些快捷键,比如Ctrl+左键可以方法跳转,左上角有前进和后退,Ctrl+G 是跳转到指定行,Ctrl+F 搜索内容,有时我们会遇到方法无法跳转,这时我们需要点击Project,选择Synchronize Files,全局关联一下,如图


![](https://user-gold-cdn.xitu.io/2017/10/22/ff418cbb48cac2dc7838112ec19a6a94)


这里要注意导入的文件不要太多,太多会导致Synchronize失败,我们可以选择性地导入一些目录


我们在导入源码的时候,有时一些汇编的源码(以.s或.S结尾)无法导入,这时我们需要点击Options,选择File Type Options,在C/C++里添加.s和.S的支持,然后Close,如图


![](https://user-gold-cdn.xitu.io/2017/10/22/70f33f9420c383049472518a92cdfe55)


然后我们重新追加一些目录,点击Project,选择Add and Remove Projec Files,选择对应目录Add Tree即可,同时我们也可以选择Remove Tree删除对应目录源码,操作如下


![](https://user-gold-cdn.xitu.io/2017/10/22/1b336d4a384ca45fff22f3c7593219ad)




## 三、 其他


在真正开始阅读Android源码之前,最好是去了解一些C/C++的语法知识,因为源码核心的部分都是用C/C++写的,如果你对一些基础语法不太了解,会看得云里雾里的,这里我给大家推荐两本书[《C标准库 中文版》](http://download.csdn.net/download/foxlee1991/10033921)和[《C++标准库 中文第2版》](http://download.csdn.net/download/foxlee1991/10034335),另外一些学习网站也不错:


- [微软官方](https://msdn.microsoft.com/zh-cn/library/cscc687y.aspx)
- [菜鸟教程](http://www.runoob.com/cplusplus/cpp-tutorial.html)
- [W3Cschool](https://www.w3cschool.cn/cpp/)


我自己本身也刚开始阅读Android源码,准备整理一些阅读笔记,我在github上建了项目,会把笔记以issue的方式展示,方便大家交流,另外我会把阅读的一些源码拷贝到Android Studio项目中,保持原有目录结构,方便大家看笔记时找到对应的源码,[项目地址](https://github.com/foxleezh/AOSP)


>关于我


- foxleezh
- [我的博客](http://foxleezh.me)
- [github](https://github.com/foxleezh/)
- [邮箱[email protected]]([email protected])

你可能感兴趣的:(android,源码,阅读)