Binder 机制详解—Binder IPC 程序结构

2014/05/06

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

前言

通过Binder入门系列,我们已知道如何创建native binder service,framework binder service,应用层binder service,并知道如何编写framework层和应用层的客户端去调用native binder service。接下来几篇博客将为大家详细分析Binder机制,目前打算写如下几篇博客:

  • 1)Binder IPC 程序结构

    介绍binder service的服务端进程,客户端进程,ServiceManager进程三者之间的关系

  • 2)Binder的系统架构

    介绍Binder系统架构的层次划分,每个层次的作用,并详细介绍系统架构的适配层和核心库。

  • 3)Binder的本地库框架

  • 4)Binder的Java层框架

Binder IPC 程序结构

Binder IPC 程序结构如下图所示:

Binder IPC 程序结构

我们先从进程的角度来分析,Binder机制共涉及3个进程, 服务端进程,客户端进程,管理各种binder service的service manager进程。图中进程2是服务端进程,进程1是客户端进程,IServiceManager服务对象所在进程便是ServiceManager进程。

我们知道servicemanager进程是init进程解析init.rc启动的关键本地服务,但是多个binder service提供者可能在同一个进程里,并不是说每个binder service提供者都各自独占一个进程,象system_server进程就有多个binder service,比如activity manager service,package manager service,power manager service。

服务端进程启动后会获取IServiceManager的引用,然后调用它的addService方法在ServiceManager里注册binder service。客户端进程启动后也会获取IServiceManager的引用,然后调用它的getService方法获取binder service引用,再调用引用的方法。

我们再从程序框架角度分析,服务端进程的BnXXX和客户端进程的BpXXX同时实现了接口xxx,这里其实使用了代理模式,并且是远程代理。客户端进程通过IServiceManager获取的binder引用其实是一个IBinder指针,BpXXX会保存这个IBinder指针,BpXXX实现接口xxx的方法时都是通过IBinder指针提交一些信息到服务端进程,这些信息包括方法的参数信息,用于接收返回值的Parcel对象,代表某个方法的常量(不同的常量表示调用不同的方法)。IBinder指针提交信息其实是通过驱动层提交到服务端进程的。服务端进程实现BnXXX时,框架层最终会调用onTransact方法,根据不同的code调用不同的方法,并将结果返回给客户端。

参考资料

书《Android系统原理及开发要点详解》 第4章Android的底层库和程序

¥打赏5毛

取消

感谢您的支持,我会继续努力的!

扫码支持
赏个5毛,支持我把

打开支付宝扫一扫,即可进行扫码打赏哦

本篇目录