• 星球作业(第十一期)Android中Binder简述


    Binder

    什么是binder?简述下它的工作过程和使用场景。


    什么是Binder?

    Binder是Android中的一个类,实现了IBinder接口;
    IPC的角度来说,Binder是Android中的一种通讯方式;
    从Android Framework角度来说,Binder是ServiceManager连接ManagerService和各个Manager(AMS、WMS等)的桥梁;
    从Android应用层角度来说,Binder是客户端与服务端通信的媒介,bindService后服务端会给客户端返回一个用于调用服务端方法的binder对象。

    总的来说,Binder是跨进程通信时的必要组件。

    Binder的工作过程

    Binder1

    1.用户态和内核态

    内核态(Kernel Mode):运行操作系统程序,操作硬件
    用户态(User Mode):运行用户程序

    对于跨进程操作,我们需要先通过ServiceManager获取ManagerService的binder对象,例如:

    ServiceManager.getService(Context.STATUS_BAR_SERVICE)
    
    • 1

    这个获取的流程就如上图所示,1服务端注册在ServiceManager中,2客户端获取到该注册的对象。这里的客户端、服务端、ServiceManager都属于用户态,彼此之间运行在不同的进程,无法直接进行通信。

    Binder则运行在内核态,有自己的线程池,且用户程序可通过固定api进行操作。

    2.注册与获取

    上图中,服务端通过ServiceManager注册服务,向Binder驱动的全局链表中插入服务端信息,然后向ServiceManager中缓存注册的服务。

    客户端通过ServiceManager获取服务端binder对象时,通过ServiceManager获取;ServiceManager会从缓存的服务信息中拿到服务对象。

    3.方法调用

    客户端通过获取到的binder对象向服务端发送请求。客户端通过上图中蓝色的调用链,将数据copy到内核空间,客户端进入等待状态;Binder驱动向服务端的todo队列中插入一条事务,等待处理完成后将结果copy回来,唤醒客户端进程。

    上述过程中进行了两次copy过程,但实际的copy只有一次,即客户端将数据copy至内核时。Binder通过共享内存的方式,客户端与服务端操作同一块内存区域。

    Binder的使用场景

    AIDL

    Messenger

    ContentProvider


    参考

    1.《Android开发艺术探索》

  • 相关阅读:
    unity打包到安卓游玩流程
    http2 mTLS代理搭建与远程端口转发(gost)
    Flink SQL 子图复用逻辑分析
    Hadoop Hive介绍
    Elasticsearch:简体繁体转换分词器 - STConvert analysis
    元注解:专门修饰注解的注解
    我的vue的学习之旅
    MAC修改python3命令为py
    sql性能优化
    hadoop复习
  • 原文地址:https://blog.csdn.net/asd501823206/article/details/133613231