都2021年了,还有人在研究Framework源码?

612 阅读6分钟

Android是一个庞大的系统,Android Framework只是对系统的- -个封装,里面还牵扯到JNI、C++、Java虚拟机、Linux系统内核、 指令集等。面对如此庞大的系统,我们得有-定的章法去阅读源码,否则就会只见树木不见森林,陷入卷帙浩繁的细节与琐碎之中。

要善于抓住主线和支线,主线指的就是Android系统的各个模块,支线就是这个模块从上值下各个层级中的重要元素,逐- -分析,直至探究到模块的最根源层。

要善于去粗存精,Android Framework也是人写的,有精华也有糟粕,并不是每行代码你都需要问个为什么,很多时候没有那么多为什么,只是当时那种情况下就那样设计了。但是对于关键函数我们要去深究它的实现细节。

说了一些技巧性的东西,有干货分享吗?有的,我这边花了一个月熬夜整理了一份《Android Framework精编内核解析》。部分知识章节发布到了在知乎上已经收获了1000+的点赞量,今天在这里拿出来分享给大家。

本笔记讲解了Framework的主要模块,从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用架构如何解决实际的问题,由浅入深,详细解析Framework,让你简单高效学完这块知识!

第一章:深入解析Binder

Binder机制作为进程间通信的一种手段,基本上贯穿了andorid框架层的全部。所以首先必须要搞懂的Android Binder的基本通信机制。

本章知识点

  • Binder 系列—开篇

  • Binder Driver 初探

  • Binder 驱动概述

  • Binder 核心方法 ……

  • Binder Driver 再探

  • Binder 通信简述

  • Binder 通信协议

  • 场景总结

  • Binder 内存机制

  • Binder 启动 ServiceManager

  • 启动过程

  • 核心工作

  • 获取 ServiceManager

  • 获取 ProcessState 对象

  • 获取 BpBinder 对象

  • 获取 BpServiceManager

  • 注册服务(addService)

  • ProcessState

  • 服务注册

  • Binder Driver

  • ServiceManager

  • 获取服务(getService)

  • Framework 层分析

  • Binder 架构

  • Binder 类图

  • Binder 类分层

  • 初始化

  • 注册服务

  • 获取服务

  • 如何使用 Binder

  • 如何使用 AIDL

  • Binder 总结

  • Binder 面试题全解析

第二章:深入解析Handler

相信大家都有这样的感受:网上分析 Handler 机制原理的文章那么多, 为啥还要画蛇添足整理这份笔记呢?不是说前人们写的文章不好,我就是觉得他们写的不细, 有些点不讲清楚,逻辑很难通顺的,每次我学个什么东西时遇到这种情况都贼难受。

本章先宏观理论分析与 Message 源码分析,再到MessageQueue 的源码分析,Looper 的源码分析,handler 的源码分析,Handler 机制实现原理总结。最后还整理Handler 所有面试题大全解析。

Handler这章内容很长,但思路是循序渐进的,如果你能坚持读完我相信肯定不会让你失望。

第三章:Dalvik VM 进程系统

Andorid系统启动、init 进程、Zygote、SystemServer启动流程、 应用程序的创建使用,Activity的创建、销毁 Handler和Looper。

第四章 深入解析 WMS

窗口管理框架 系统动画框架 View的工作原理。

第五章 PackagerManagerService

包管理服务。资源管理相关类

小伙伴们如果有需要这份《Android Framework精编内核解析》,点击这里即可【免费领取】!

最后

如何学习Android Framework?路只有一条:Read the f*cking source code。至于如何「平稳」过渡,其实我觉得学习曲线并没有那么陡峭——Android Framework的代码不也是代码?不理解是因为没有整体把握而已。

不论是看书,看博客,你的最终目的只有一个「学会看源码」,而不是「学会源码」。关于如何阅读源码,这不是一个简单的问题,我有几点经验:

1.看不懂的多读。上面已经说过了,没有人一学就会;特别是对于初学者,你刚看系统源码,肯定一头雾水;万事开头难,在你觉得艰深晦涩的时候,你就当在背课文;Android Framework的代码时遵循一定规范的,你在背了一篇课文之后,再去读别的课文,读到一半的时候就算你看不懂,很有可能你就会知道下面要讲什么了,虽然下面要讲的你也不懂。背熟了之后,你就可以想每一句是什么意思了;而这里面的「段落」、「句子」不就是普通的代码吗?就这样,一步一步串联起来,聚沙成塔,积少成多,就水到渠成了。「书读百遍,其义自现」讲的就是这道理。如果你真的想要学习Framework,一定要多读,硬着头皮读,不要放弃,否则都是扯淡。

2.不重要的少读。看不懂的很容易知道是什么,那么怎么知道哪些代码是不重要的呢?这里有两层意思:其一,强调的是大局观,在初学习一个模块的时候,你需要先把握整体,再了解局部;这个场景下,所有的细节都是不重要的。其二,那些真正不重要的逻辑;你刚学习的时候肯定没有办法知道哪些是影响不大的逻辑,所以你需要跟着书籍,博客,让前人带路;如果跟着它们的脚步走通了这条路,那你就自己独立走一遍,这时候你肯定会走丢,然后你跟踪、尝试,接着到达终点;这时候你自然就知道,哪些重要,哪些不重要。

3.边读边思考。学而不思则罔,思而不学则怠。带着问题去阅读源码,这里是什么意思?为什么需要这么做?这样的实现是优雅还是俗套?有没有更好的实现办法?如果我来写,我会怎么写?诸如此类,有了思考就有了自己的理解。

4.不是所有的都需要思考。接上条,Framework的代码也是人写的,有精华,自然有糟粕,也有食之无味的。你不用对着每一段代码都问个十万个为什么。一个问题通常有很多种解决方案,当时的设计者选择目前这种实现,有兼容问题有历史原因,还有它自己的理解;不是所有的实现在现在看来都是很好的实现,所以,追问这些问题很多时候都没有意义,不要过度解读。举个例子,Android的IPC机制为什么用Binder?也许有人说,Socket不安全,效率不够高;共享内存使用不方便,等等。但是你去看看这个问题:为什么 Android 要采用 Binder 作为 IPC 机制? - Android 开发 你就知道,很多时候并没有那么多为什么。

5.记得做笔记。做笔记的重要性在于,它可以记下你自己在某个阶段自己的理解,当你更进一步的时候回头再看当初的理解,想想哪里是对的,哪里又有问题,这是一个相当有意思的过程。我想每一个人在看自己之前写的代码,都会有在某个地方觉得自己是沙比的时候。根据你学习过程简单总结一下,这样你的元认知能力就得到了提升。

最后,文明交流,拒绝撕逼。