Binder学习笔记

作者: 森码 | 来源:发表于2019-03-21 11:33 被阅读10次

    在学习Binder时看了不少资料,但是网上的文章质量参差不齐,对Binder的理解程度也不尽相同,所以走了不少弯路,这里总结出来让有意学习的同学能尽快上手了解。

    学习流程
    1. 自己实现一个AIDL,分析AIDL的组成和逻辑,在没有AIDL的情况下手写一个Binder。
    2. 了解Activity的启动流程,对Binder和AIDL有一个具体的认识。(推荐刘望舒的《Android进阶解密》)
    3. 了解Binder原理
    4. 了解Binder的设计理念
    5. 查看源码
    参考链接

    入门 写给 Android 应用工程师的 Binder 原理剖析
    理解 Android Bander设计与实现 - 设计篇
    进阶 源码分析

    笔记

    Binder是Android中主要的进程间通讯方式(有一些Socket),无论是四大组件还是Framework层的SystemService都是通过Binder机制来进行沟通的。

    首先从性能上讲Binder的通过内存映射的方式,将拷贝的次数降低到了一次,其次是稳定性,Binder是基于C/S架构去设计的,架构清晰、职责明确又相互独立。最后是安全性,Android为每个安装好的APP都分配了自己的UID,拥有身份识别的步骤。

    Binder的通信流程
    1. Binder驱动在内核空间创建一个数据接收缓存区
    2. 然后才在内核空间中开辟一块内核缓存区,开辟完之后这两个区域建立映射关系,之后内核中数据接收缓存区和接收进程用户地址也建立内存映射。
    3. 发送方进程通过系统调用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设计与实现 - 设计篇,如果对底层感兴趣还有源码分析

    相关文章

      网友评论

        本文标题:Binder学习笔记

        本文链接:https://www.haomeiwen.com/subject/pqhqvqtx.html