Binder的学习与理解笔记之一:总体印象

1.Binder是一种进程间的通信方式,由Android引入,广泛应用于Android的进程间通信(如WMS、AMS等),相对于Socket的方式,因其少了一次内存copy,所以速度更快。
2.接1中所提的内存copy减少一次,是如何做到的呢?有两个进程A、B,需要进行数据传递,进程B发起Binder驱动,申请共享内存块,Binder驱动记录该共享内存块地址,进程A的数据直接copy入Binder驱动所记录的共享内存块,进程B则可使用该数据。
3.Binder有四种角色分别为:
a.Binder驱动
Binder驱动提供最底层的Binder行为支持,支持binder_open(开启Binder)、mmap(内存分配)、icol(对数据的读写支持)
b.ServiceManager
伴随着Android boot时启动,在整个系统中只有一份
也是一个Binder Server
进程号为0,可以被所有其他的Binder Server及Binder Client直接找到
提供进程注册、进程id查询、进程列表罗列
c.Binder Server
进程通信的服务端,启动时先向ServiceManager注册,然后轮询接受客户端请求,例如系统启动的WMS、AMS
d.Binder Client
进程通信的客户端,启动后向ServiceManager查询Binder Service
在林学森先生所著的《深入理解Android内核设计思想》一书中将上述四种角色映射至网络中,即:
Binder驱动 -- 路由器
ServiceManager -- DNS
Binder Server -- Server
Binder Client -- Client
4.Android系统启动时会启动ServiceManager
// frameworks/native/cmds/servicemanager.c
    
    三件事:binder_open、binder_become_context_manger、binder_loop
对应于:开启binder驱动、声明为ServiceManager、轮询等待指令
然后各函数最终会调到Binder驱动层的open、mmap、icol
5.对上层用户而言,换句话说,对应用层的apk而言,要使用Binder,从Java层调起,最终会调至C++层的Binder驱动,中间过程极为复杂,以获得某一进程id为例,描述一下:
a.首先,Java层的ServiceManager类,binder的入口类,提供最上层的static方法封装,用户直接可以调用ServiceManager.getService(name)获得所需的Binder Server
//android.os.ServiceManager.java
    
b.通过getIServiceManager找到IServiceManager的实现
    
   
    //android.os.ServiceManagerNative
    
    
由上引出了三个类,IServiceManager提供接口规范,ServiceManagerNative是一个中转,最终的实现为ServiceManagerProxy
c.找到IServiceManager之后,使用该实现,调用它的getService:
    
d.要找到上图中的tracesact实现:
首先看BinderInternal.java
//frameworks/base/core/java/com/android/internal/os/BinderInternal.java
    
c++层对应的代码
//framework/base/core/jni/android_util_Binder.cpp
    
ProcessState的getContextObject会在C层得到BpBinder对象,所后通过上图中的return转为Java层的对象BinderProxy。
因此,c中的remote为BinderProxy,所调用的transact为BinderProxy类中的transact方法。
e.BinderProxy中的实现是一个native方法,会调至android_util_Binder.cpp中的android_os_BinderProxy_transact实现
    
然后调用BpBinder的transact
    
调至IPCThreadState的transact

总结一下,上面所涉及的几个类的功能:
ServiceManager :工具类,提供统一的调用行为
IServiceManager :提供统一的对外的可使用的规范
ServiceManagerNative :中转类,最终调至ServiceManagerProxy
ServiceManagerProxy :Java层Binder的代理
BinderInternal :中转类,调至c层的ProcessState
ProcessState :负责得到c层的BpBinder对象,同时映射到Java层的BinderProxy
BpBinder :c层binder驱动上层的类
BinderProxy :只是BpBinder在Java层的代理
IPCThreadState :执行Binder具体行为,调用Binder驱动

上面的类ServiceManager、IServiceManager、ServiceManagerNative、ServiceManagerProxy、BinderInternal、BinderProxy位于Java层
ProcessState、BpBinder、IPCThreadState位于C层

猜你喜欢

转载自blog.csdn.net/kcstrong/article/details/80321207