写在前面:
原本计划用一个系列来记录自己学习Android Media框架的心得感受,但是刚刚起步就碰到了问题,由于Media框架中用了许多服务(binder service),而且我不太熟悉binder的用法,所以看代码的过程中心里总有些忐忑,害怕遇到binder,这对我对框架结构的理解学习是十分不利的。
binder作为android中最重要的进程间通信方式之一,不去了解始终是不行的,所以就下定决心去读一读,于是就有了这篇binder阅读开篇。当然这只是我的阅读笔记,共享出来是让想了解binder的同学一起学习,里面肯定会漏洞百出,也会有很多错误,如果有同学看到了错误,欢迎指出,我会努力改进的^_^
关于内容:
网上已经有许多大佬讲解了binder驱动,但是对于我这种小白来说,还是太难理解了。许多博文会去讲解binder是如何做一次数据拷贝的,花很大的功夫做内存分配的讲解,但这并不是我想深入了解的。作为一个新手,我想了解的更多的是binder中的数据是如何传输的?binder对象是如何传递的?从service manager中找到了服务,这个服务是什么?找到了服务怎么就可以调用这个服务提供的方法了呢?…
原先只看了binder C++框架的内容,也就是Bn、Bp那一套,到这里已经可以熟练使用binder了,但是好奇心作怪,又想了解了解上面疑问的答案,可实在是太难了!其实光想讲清楚Bn、Bp那一套,也需要对binder driver有比较多的理解,而这已经远远超出了我能力的范围。
对于我这种新手来说,binder driver还是太复杂,完全不能理解其中的细节实现。最后斟酌了一下,也算是放过自己,阅读过程中只去看大致的流程,譬如mmap,我只需要知道用户空间和内核空间共享了一片内存空间即可,至于如何共享的就不去过多理解,而数据传输部分可以多了解一下。还有其他的一些driver相关的知识,我们只要了解知道,不要深究为什么,不然就会陷入死胡同。
关于参考
学习binder需要很多的前备知识,对于我这位转码的同学(不了解Linux相关的底层操作系统相关的知识)来说,binder driver如天书一般,也下定决心后面会恶补基础知识。
学习过程中参考了很多大佬的博文,这里列出部分我看到的觉得写的好的参考,有了他们的帮助我才能够有理解binder的机会:
Android跨进程通信IPC
Binder系列
Android源码分析 - Binder驱动
代码参考:
Android 13 kernel-5.15
Android 13 framework/native/libs/binder/