Binder 之 oneway 机制

Binder 是 Android 中的 IPC(进程间通信)的最要一环,它的作用就是:

  • 异步调用
    应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。
  • 串行化处理
    对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。

像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。

本篇不展开它是如何通信的,只聊聊它的机制,分两种:

  • oneway:调用方非阻塞(non-block)
  • 非 oneway:调用方阻塞(休眠)

首先是非 oneway 的情况:

non-one-way.png

这里的挂起相当于 Thread 的 sleep,是真正的"休眠",底层调用的是 waitEventInterruptible(), Linux 系统函数。

oneway 的情况,客户端就不需要挂起线程等待:

one-way.png

写在最后,涉及到的 binder 命令也有规律:

  • 由外部发送给 binder 驱动的都是 BC_ 开头;
  • 由 binder 驱动发往外部的都是 BR_开头;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容