Binder 是 Android 中的 IPC(进程间通信)的最要一环,它的作用就是:
- 异步调用
应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。 - 串行化处理
对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。
像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。
本篇不展开它是如何通信的,只聊聊它的机制,分两种:
- oneway:调用方非阻塞(non-block)
- 非 oneway:调用方阻塞(休眠)
首先是非 oneway 的情况:
这里的挂起相当于 Thread 的 sleep,是真正的"休眠",底层调用的是 waitEventInterruptible(), Linux 系统函数。
oneway 的情况,客户端就不需要挂起线程等待:
写在最后,涉及到的 binder 命令也有规律:
- 由外部发送给 binder 驱动的都是 BC_ 开头;
- 由 binder 驱动发往外部的都是 BR_开头;