Binder 之 oneway 机制

2,860 阅读1分钟

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_开头;