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

  • 学习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系统架构

将这个C/C++编译链接生成二进制文件的这个过程是谁做的?

谈到 Android 系统架构,很多人第一反应可能就是这张最经典的图片:

sshot-1.png

但是,上面这张图已经过时了,因为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源码的时候会有所体现。

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

需要准备的工作:

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

  • 先结合官网等资料对整个Android系统做一个整体的把握,然后进行具体学习,接着持续迭代学习过程。

  • 使用Source Insight/Android Studio等高效率的工具看源码、进行代码的跟踪,必要的时候进行Debug。

  • 结合UML建模,画类图/时序图,避免思路混乱。

  • 推荐“囫囵吞枣”式的学习,先粗略学习,然后细节深入。囫囵吞枣在这里并不是说不求甚解,这里的囫囵吞枣是要知道“吞了几个”,将来自己需要的时候再进行补充。跳跃式的学习、渐进式学习相结合。

  • 先顶层,再到底层,从常用的系统级API或者插件级API进行入手学习。

Android源码阅读方法相关推荐

  1. android源码阅读笔记1-配置源码路径/阅读源码方法讨论

    开始之前 android studio中配置android源码路径 android studio中有源码的路径,你只需要打开SDK Manager下载源码然后重启android studio即可查看源 ...

  2. Android源码阅读---init进程

    Android源码阅读-init进程 文章目录 Android源码阅读---init进程 1. 编译命令和进程入口 1. init 进程编译命令 2. main函数流程 2. 主函数处理流程 1. 创 ...

  3. 各种资源被封后android源码下载方法

    各种资源被封后android源码下载方法. 分类: Android 源码下载2013-08-29 22:27 579人阅读 评论(0) 收藏 举报 先给个国内的下载链接,转至:http://www.a ...

  4. android源码下载方法 批量下载 基于windows os

    安装win版的Gitbash, 在这里 http://msysgit.googlecode.com/files/Git-1.6.0.2-preview20080923.exe. 选择默认安装路径(否则 ...

  5. 最完整的android源码获取方法及环境建立

    网上看了前人的那么多关于android源码获取方法及环境建立,门路可真多,今天我就总结一下个人学习经验,算是比较完整的了. 一.获取方法: 1.直接找到人家已经下载好的android源码,如cupca ...

  6. Android源码阅读平台

    Android源码阅读平台 前言 链接 前言 ​ 记录Android源码阅读平台 链接 AndroidXRef:http://androidxref.com/ AndroidXRef-ng:https ...

  7. android源码使用方法,android源码中使用到的设计模式(创建型)

    1.单例模式 1.1定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供者个实例. 1.2单例的形式 饿汉模式:第一次就加载,用空间换时间. public class SingleTon { ...

  8. Android源码阅读-编译8

    Android8.0源码的下载就比较蛋疼了,因为我们只有通过VPN才能访问Google的一些东西,对于源码这东西,动不动几十个G的话,通过VPN来下载的话,肯定懵逼啊,所以我们得另辟途径.[清华大学开 ...

  9. Android源码阅读工具AndroidXRef使用说明

    (62条消息) AndroidXRef使用说明_n_fly的博客-CSDN博客 http://www.aospxref.com AndroidXRef (81条消息) 官方版Android源码查看工具 ...

最新文章

  1. 蓝桥杯 历届试题 九宫重排
  2. 面试官:HashMap有几种遍历方法?推荐使用哪种?
  3. Java容器有哪些?
  4. 编程是使用计算机的什么部位,第一章 编程语言及计算机介绍
  5. python mongodb 设置密码前一篇ok,csv文件存入mongodb
  6. Android MVP+Retrofit(封装)+RxJava实例
  7. SAP soamanager发布的Webservice服务,调用时出现http500报错
  8. 配置centOS下的Python
  9. mac文件管理服务器,Path Finder For Mac v8.6 高效的文件管理工具 _ 黑苹果乐园
  10. iOS 视频方向修正
  11. 爬取Google Play中app的用户评论(1)
  12. 使用高德地图做经纬度转换( 把GPS 转高德的经纬度 )
  13. 火地晉 (易經大意 韓長庚)
  14. 百度知道到底是哪个国家的公司
  15. U盘制作启动盘后无法使用,显示无法格式化等信息
  16. 插画版 Kubernetes 指南
  17. 什么是软连接,软连接的作用
  18. Unity 动态添加烘焙贴图
  19. 通过自定义ServiceHost实现对WCF的扩展[实例篇]
  20. android 优化编译,Android-Easy-Compile(编译优化安卓系统)

热门文章

  1. java如何设置缓冲区_缓冲区设置JAVA NIO 缓冲区
  2. 典型实践|红豆股份王昌辉:中国服装企业转型升级迎来新的春天
  3. 网页引用第三方字体总结
  4. 运动中带蓝牙运动耳机不舒适?那是你没选对产品
  5. 企业数字化转型到底该怎么做?
  6. (第四章)Unity3D-地球旋转Dome
  7. 大型网站技术架构图书思维导图
  8. Python爬取阴阳师式神全图鉴图片
  9. 乐视2017暑期实习生笔试题(一)
  10. Kali--Nmap实战