在学习Binder时看了不少资料,但是网上的文章质量参差不齐,对Binder的理解程度也不尽相同,所以走了不少弯路,这里总结出来让有意学习的同学能尽快上手了解。
学习流程
- 自己实现一个AIDL,分析AIDL的组成和逻辑,在没有AIDL的情况下手写一个Binder。
- 了解Activity的启动流程,对Binder和AIDL有一个具体的认识。(推荐刘望舒的《Android进阶解密》)
- 了解Binder原理
- 了解Binder的设计理念
- 查看源码
参考链接
入门 写给 Android 应用工程师的 Binder 原理剖析
理解 Android Bander设计与实现 - 设计篇
进阶 源码分析
笔记
Binder是Android中主要的进程间通讯方式(有一些Socket),无论是四大组件还是Framework层的SystemService都是通过Binder机制来进行沟通的。
首先从性能上讲Binder的通过内存映射的方式,将拷贝的次数降低到了一次,其次是稳定性,Binder是基于C/S架构去设计的,架构清晰、职责明确又相互独立。最后是安全性,Android为每个安装好的APP都分配了自己的UID,拥有身份识别的步骤。
Binder的通信流程
- Binder驱动在内核空间创建一个数据接收缓存区
- 然后才在内核空间中开辟一块内核缓存区,开辟完之后这两个区域建立映射关系,之后内核中数据接收缓存区和接收进程用户地址也建立内存映射。
-
发送方进程通过系统调用copyfromuser(),将数据拷贝到内和缓存区,由于三块内存都存在映射关系,接收端收到了消息。
image.png
为什么是Binder?
Android是基于Linux的一套系统,理论上来说很多Linux的工具和命令在Android中都是可以使用的,在Linux中进程间通讯的方式有很多种,管道、FIFO、消息队列、信号量、共享内存及Socket(Linux进程间通信),如此多的方式为什么Binder能脱颖而出,但是却被改造了一番?
回答:为什么 Android 要采用 Binder 作为 IPC 机制?这里自己功力不够,就不乱做评论了。
在上面的回答中已经能解答我们80%的问题了,但是Binder到底在Android中是个什么样的地位呢?
举个例子吧,我们平常写的AIDL中的Stub就是继承了Binder;Activity启动时会调用IActivityManager然后会跑到ActivityManagerNative中就是跨进程通信;最平常的getSystemService(),这些Service并不是每个App都维护自己的(这显然不实际),都是通过系统维护,在我们需要时传递给我们。
Binder原理
写给 Android 应用工程师的 Binder 原理剖析,这个已经能完美解答大部分Binder的问题了。如果想深入的了解可以结合Android Bander设计与实现 - 设计篇,如果对底层感兴趣还有源码分析。
网友评论