文档章节

Android 源码分析之旅1--系统架构与分析方法、工具

猴亮屏
 猴亮屏
发布于 2017/10/19 10:24
字数 2076
阅读 34
收藏 2
 

《Android 源码分析之旅》目录

ape_fwk_all.png

ape_fwk_all.png

《Android 源码分析之旅》的全部目录将作如下安排:

  1. 第1章节——本篇文章,将介绍一些基本的概念、方法、工具。
  2. 第2章节——着重介绍Binder IPC机制。因为Android Framework中充斥着进程间通信的过程,因此这里提前学习。
  3. 第3章节——介绍一些Android常见源码分析。
  4. 第4章节——着重介绍HAL层的相关知识。
  5. 后续慢慢补充。。。

为什么要学习Android源码?

很多读者,尤其是初学者特别抗拒去看源码,这里我说明一下为什么要进行源码分析。其中包括下面一些好处:

  1. 学习Android源码有助于我们学习其中的设计模式、思想、架构。
  2. 熟悉整个源码的架构,有助于我们更加正确地调用Android提供的SDK,写出高效正确的代码。
  3. 学习源码有助于我们面试,因为大公司都喜欢问这些。
  4. 学习源码有助于我们学习一些黑科技,比如学习插件化的从时候我们需要学习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系统架构.jpg

但是,上面这张图已经过时了,因为Android系统架构中增加了HAL层,新的架构可以在source.android.com中看到:

ape_fwk_all.png

ape_fwk_all.png

根据上图,Android系统架构从上往下分别是:

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

其中,HAL层常见的模块有:

ape_fwk_hal.png

ape_fwk_hal.png

细节

  1. Android Framework:包含了HAL层以上的所有层,指的是整个系统的框架。对应AOSP中的framework文件夹。
  2. Application Framework:更多的指是API相关的,属于应用程序这边的框架。比如Activity、ActivityThread等,而不包含AMS。
  3. Android Framework包含了Java实现部分以及C/C++(native)实现部分。以后在分析Camera源码的时候会有所体现。

源码的下载与查看、工具介绍

需要准备的工作:

  1. Ubuntu/Mac系统下,推荐使用Android Studio进行查看。
  2. Windows系统下,推荐使用Source Insight进行查看。
  3. UML建模工具:推荐使用Start UML,用于画类图以及时序图。
  4. 下载源码,推荐下面文章中使用网盘下载的方式。

参考文章如下:

关于源码的下载与导入查看的参考文章:

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源码是十分庞大与复杂的,这里推荐一些源码分析的经验:

  1. 先结合官网等资料对整个Android系统做一个整体的把握,然后进行具体学习,接着持续迭代学习过程。
  2. 使用Source Insight/Android Studio等高效率的工具看源码、进行代码的跟踪,必要的时候进行Debug。
  3. 结合UML建模,画类图/时序图,避免思路混乱。
  4. 推荐“囫囵吞枣”式的学习,先粗略学习,然后细节深入。囫囵吞枣在这里并不是说不求甚解,这里的囫囵吞枣是要知道“吞了几个”,将来自己需要的时候再进行补充。跳跃式的学习、渐进式学习相结合。
  5. 先顶层,再到底层,从常用的系统级API或者插件级API进行入手学习。



作者:小楠总
链接:http://www.jianshu.com/p/a4b40a9d1b4f
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文转载自:http://www.jianshu.com/p/a4b40a9d1b4f

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 36
博文 531
码字总数 57346
作品 4
北京
Android工程师
私信 提问
Android进阶之旅与你同行

1.分享的简介 之所以选择内涵段子,是因为这个项目无论从用户体验还是性能方面都很不错,虽然功能不多但是技术上涉及的部分比较多。主要内容有Android源码阅读设计模式分析,以及第三方框架源...

红橙Darren
2017/02/03
0
0
2017 我用 5 个月分享了 98 篇优秀博文

对上半年所分享的文章进行一个整理,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 如果觉得...

code小生
2018/10/30
0
0
转载:最强最全干货分享:Android开发书籍、教程、工具等

最全干货分享,本文收集整理了Android开发所需的书籍、教程、工具、资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益。 入门 《Learning Android(中文版)》 本书为Andro...

拉偶有所依
2015/01/09
152
3
最强最全干货分享:Android开发书籍、教程、工具等

最全干货分享,本文收集整理了Android开发所需的书籍、教程、工具、资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益。 入门 《Learning Android(中文版)》 本书为Andro...

拉偶有所依
2015/01/09
0
1
android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码

Android精选源码 精练的范围选择器,范围和单位可以自定义(http://www.apkbus.com/thread-603930-1-1.html) 自定义View做的小鸟游戏(http://www.apkbus.com/thread-603934-1-1.html) androi...

Android爱开源
2018/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android 保活

1.Android不间断上报位置信息-应用进程防杀指南 2.Android锁屏无法继续定位问题 3.微信 Android 客户端后台保活经验分享 4.Android进程保活 5.android进程保活实践...

IT追寻者
32分钟前
1
0
基于Kubernetes的Spark集群部署实践

Spark是新一代分布式内存计算框架,Apache开源的顶级项目。相比于Hadoop Map-Reduce计算框架,Spark将中间计算结果保留在内存中,速度提升10~100倍;同时它还提供更丰富的算子,采用弹性分布...

hblt-j
32分钟前
5
0
NTP服务搭建

NTP服务搭建 如果是单独安装这个服务,请直接开始即可。如果是为了解决hadoop集群的时针偏差问题,配置ntp服务时,务必先关闭chd的相关服务。 一、准备环境 1、操作系统 CentOS7操作系统,准...

星汉
34分钟前
3
0
SPring AOP(面向切面编程)

AOP(面向切面编程) AOP是OOP(面向对象编程)的延续,但是它和面向对象的纵向编程不同,它是一个横向的切面式的编程。可以理解为oop就是一根柱子,如果需要就继续往上加长,而aop则是在需要...

MrBoyce
34分钟前
4
0
高性能Mysql:复制

1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新...

watermelon11
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部