《Android 源码分析之旅》目录

ape_fwk_all.pnghtml
《Android 源码分析之旅》的所有目录将做以下安排:android
- 第1章节——本篇文章,将介绍一些基本的概念、方法、工具。
- 第2章节——着重介绍Binder IPC机制。由于Android Framework中充斥着进程间通讯的过程,所以这里提早学习。
- 第3章节——介绍一些Android常见源码分析。
- 第4章节——着重介绍HAL层的相关知识。
- 后续慢慢补充。。。
为何要学习Android源码?
不少读者,尤为是初学者特别抗拒去看源码,这里我说明一下为何要进行源码分析。其中包括下面一些好处:面试
- 学习Android源码有助于咱们学习其中的设计模式、思想、架构。
- 熟悉整个源码的架构,有助于咱们更加正确地调用Android提供的SDK,写出高效正确的代码。
- 学习源码有助于咱们面试,由于大公司都喜欢问这些。
- 学习源码有助于咱们学习一些黑科技,好比学习插件化的从时候咱们须要学习Hook机制,可是学习Hook机制的时候咱们须要掌握Activity的启动流程、消息机制等等机制。
我我的以为,只懂得去调用API,跟掌握API底层的实现,这是一个码农跟高级工程师的区别。只会用API天天只能作不少重复性的工做,可是学习了源码之后,咱们可以作到不少原生API作不到的事情,这就是咱们所说的黑科技,这样可以让咱们的知识面更加普遍,由于,即便一我的天资再好也罢,若是他的见识面不够普遍,不少东西(好比说热更新、插件化、NDK)没有接触过的话,永远只能停留在他所到达的瓶颈上面。对于像本人同样在作系统APP、系统Framework层开发和定制来讲源码可能比较重要,可是这并不意味着作第三方APP的时候就不重要。固然,学习源码须要有必定的耐心,也可能须要你在分析的过程当中去画一些图(图片更加直观)、花额外的时间去学习源码用到的设计模式等等,学习源码是一个比较痛苦的事情,由于你会发现掌握了源码并不意味者你就可以一步登天。可是随着亲们慢慢地掌握了整个Android的系统架构的时候,相信你不会后悔当初本身的付出。由于我一直都相信,付出一定会有所收获。设计模式
这里扯个题外话,刚刚提到NDK,我以为NDK也是一块比较重要的模块,它可以利用C/C++来实现Java实现不了,或者用Java去实现的时候效率很低的事情,好比说QQ的变声功能、全民K歌的音频混合、视频处理、直播等等,因此有时间的话我将会写一些关于NDK的文章。架构
前言
最近一直在维护系统相机APP,打算研究和补充一下HAL层的相关知识。借此契机,打算重构一下这个《Android源码分析之旅》的文集,接下来会补充一些总体系统架构、UML(类图、时序图)、其余方面的源码分析等知识。框架
Android系统架构
谈到Android系统架构,不少人第一反应可能就是这张最经典的图片:模块化

旧版本的Android系统架构.jpg工具
可是,上面这张图已通过时了,由于Android系统架构中增长了HAL层,新的架构能够在source.android.com中看到:源码分析

ape_fwk_all.png学习
根据上图,Android系统架构从上往下分别是:
- 应用框架:应用框架最常被应用开发者使用。做为硬件开发者,咱们应该很是了解开发者 API,由于不少此类 API 均可直接映射到底层 HAL 接口,并可提供与实现驱动程序相关的实用信息。
- Binder IPC:Binder 进程间通讯 (IPC) 机制容许应用框架跨越进程边界并调用 Android 系统服务代码,从而使得高级框架 API 能与 Android 系统服务进行交互。在应用框架级别,开发者没法看到此类通讯的过程,但一切彷佛都在“循序渐进地运行”。
- 系统服务:应用框架 API 所提供的功能可与系统服务通讯,以访问底层硬件。服务是集中的模块化组件,例如窗口管理器、搜索服务或通知管理器。Android 包含两组服务:“系统”(诸如窗口管理器和通知管理器之类的服务)和“媒体”(与播放和录制媒体相关的服务)。
- 硬件抽象层 (HAL):硬件抽象层 (HAL) 会定义一个标准接口以供硬件供应商实现,并容许 Android 忽略较低级别的驱动程序实现。借助 HAL,咱们能够顺利实现相关功能,而不会影响或无需更改更高级别的系统。HAL 实现会被封装成模块 (.so) 文件,并会由 Android 系统适时地加载。
- Linux 内核:开发设备驱动程序与开发典型的 Linux 设备驱动程序相似。Android 使用的 Linux 内核版本包含一些特殊的补充功能,例如:唤醒锁(这是一种内存管理系统,可更主动地保护内存)、Binder IPC 驱动程序以及对移动嵌入式平台很是重要的其余功能。这些补充功能主要用于加强系统功能,不会影响驱动程序开发。咱们可使用任一版本的内核,只要它支持所需功能(如 Binder 驱动程序)。不过,建议使用 Android 内核的最新版本。
其中,HAL层常见的模块有:

ape_fwk_hal.png
细节
- Android Framework:包含了HAL层以上的全部层,指的是整个系统的框架。对应AOSP中的framework文件夹。
- Application Framework:更多的指是API相关的,属于应用程序这边的框架。好比Activity、ActivityThread等,而不包含AMS。
- Android Framework包含了Java实现部分以及C/C++(native)实现部分。之后在分析Camera源码的时候会有所体现。
源码的下载与查看、工具介绍
须要准备的工做:
- Ubuntu/Mac系统下,推荐使用Android Studio进行查看。
- Windows系统下,推荐使用Source Insight进行查看。
- UML建模工具:推荐使用Start UML,用于画类图以及时序图。
- 下载源码,推荐下面文章中使用网盘下载的方式。
参考文章以下:
关于源码的下载与导入查看的参考文章:
http://www.cnblogs.com/Napoleon-Wang/p/6706773.html
关于Source Insight的使用:
http://blog.csdn.net/shulianghan/article/details/50553001
关于UML建模的知识:
http://www.jianshu.com/p/a0704aa2b092
源码分析方法与经验
关于源码架构的介绍,参考下面的文章:
http://blog.csdn.net/itachi85/article/details/54695046
从顶层到底层,Android源码是十分庞大与复杂的,这里推荐一些源码分析的经验:
- 先结合官网等资料对整个Android系统作一个总体的把握,而后进行具体学习,接着持续迭代学习过程。
- 使用Source Insight/Android Studio等高效率的工具看源码、进行代码的跟踪,必要的时候进行Debug。
- 结合UML建模,画类图/时序图,避免思路混乱。
- 推荐“囫囵吞枣”式的学习,先粗略学习,而后细节深刻。囫囵吞枣在这里并非说不求甚解,这里的囫囵吞枣是要知道“吞了几个”,未来本身须要的时候再进行补充。跳跃式的学习、渐进式学习相结合。
- 先顶层,再到底层,从经常使用的系统级API或者插件级API进行入手学习。
做者:小楠总 连接:http://www.jianshu.com/p/a4b40a9d1b4f 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。