Binder机制学习

Binder是用在Android系统中的一个进程间通信(IPC)机制,使用C/S架构,服务端和客户端通过Binder进行跨进程的数据交换,Binder继承自IBinder接口,因此IBinder接口最重要的一个方法是transact,所以虽然Android为了减少开发者开发工作量,采用了代理模式封装了一个复杂的Binder架构,但是其本质都是从源进程传递数据给目标进程,然后目标进程处理完后再把数据回传给源进程,所以在学习Binder实现原理时最好是要不时回想起框架实现的目的,才能不被架构里的各种类似的概念搞迷糊。

关于Service,其实就是提供服务的代码,在java端是通过AIDL来定义进程间通信的接口,Service端实现接口并通过onBind方法向客户端公开该接口,客户端取得该接口后就可以调用接口的相关方法。调用方法也很简单,具体可以参考官方API指南AIDL章节

img点击并拖拽以移动

复杂的架构都是为了更方便别人进行调用,我们可以在java端或native端进行binder的使用,作为java开发者我们要使用Binder只要实现图上绿色部分的接口和类就够了(绿色部分的aidl类为android sdk自带的apidemo中的一个示例),而作为native端的开发者需要实现如蓝色部分的接口和类。

关于Binder的源码分析的书籍有《Android系统源代码情景分析[罗升阳著]》《深入理解Android卷I[邓平凡著]》《Android技术内幕系统卷[杨丰盛著]》,写的都比较好,最好是边看源码边看书,看的时候多想想为什么这么设计,为了防止自己忘记,画了几幅时序图辅助理解。如下四幅图为Binder通信的四个主要过程:

ServiceManagerProxy获取过程

img点击并拖拽以移动

向ServiceManager注册Service过程

img点击并拖拽以移动

Service代理对象获取过程

img点击并拖拽以移动

跨进程调用过程

img点击并拖拽以移动