搜索
 找回密码
 立即注册

简单一步 , 微信登陆

Android Binder

作者:sean | 时间:2016-9-28 11:32:06 | 阅读:4377| 只看该作者
Binder
    在Android系统中,是以进程为单位分配和管理资源的。处于保护机制,一个进程不能直接访问另一个进程的资源,但为了多个进程完成同一任务,要求进程间能够互相通信。Android同时为Java环境和C/C++环境提供了Binder机制。Binder通信是基于server与client的,Binder通信是同步而不是异步的。
    Binder机制的组成:
1.  service manager:管理Android系统中的所有服务;
2.  server:Binder的服务器端;
3.  client:Binder的客户端;
4.  服务代理:服务代理指在客户端生成的服务端代理(proxy)。服务代理具有Server的功能,这样客户端可以通过服务代理去访问服务端的方法。
Binder的工作流程:
1.  客户端首先获得服务器端的代理对象;
2.  客户端通过调用服务器代理对象的方式向服务器端发送请求;
3.  代理对象将用户请求通过Binder驱动发送到服务器进程;
4.  服务器进程处理用户请求,并通过Binder驱动返回处理结果给客户端的服务器代理对象;
5.  客户端收到服务器端的返回结果。
Binder的几个缩写:
p是proxy即代理的意思,Bp就是BinderProxy
Bn 是Binder Native的含义,是和Bp相对的,Bp的p是proxy代理的意思,那么另一端一定有一个和代理打交道的东西,这个就是Bn
下来结合代码看看Binder的实现,为了实现进程间的双向通信,Service跟Client的角色可以灵活变化,这就产生了两种情况:
1.  Supernova(Service)<->Framework(Client):
App通过调用Framework提供的接口,然后Framework通过Binder通信,向Supernova请求服务。
a.  Supernova提供的服务即Binder的服务器端,服务器端要实现BnXXX。以便和客户端的BpXXX,即客户端的代理对象打交道,首先说说Supernova提供哪些服务?Supernova的服务源代码定义在Supernova/projects/tvos,命名规则为XXXservice,这些服务对应的BnXXX定义
这些BnXXX对象的初始化在void *AndroidServiceInitThread(void * pData)函数,BnXXX中主要是定义并实现了onTransact()函数,其作用就是,当在客户端的代理对象调用了transact函数后,这边的onTransact()函数就会被调用。
然后要向Service Manager注册服务,注册服务在每个BnXXX对象的instantiate()方法实现,如下:
服务的具体实现在Msrv_XXX.cpp里。
BnXXX的实现,例如先定义一个继承IInterface的类ITimerManager,再由BnTimerManager继承ITimerManager类,而TimerManagerService::Client又继承于BnTimerManager,所以ITimerManager定义的虚函数都在TimerManagerService::Client实现。
至此,服务器端的Binder已建立好了。
b.  客户端的Binder实现。
首先通过AIDL定义接口,例如ITvServiceServerTimer,生成ITvServiceServerTimer.Stub类,再在TimerBinder实现方法。
  App调用AIDL提供的接口:

2.  Framework(Service) --- Supernova(Client):
当Supernova感知到状态的变化,需要通知app做相应的UI显示动作,需要发出一个消息给Framework,Framework再通过消息机制把通知给到ap
这里举一个例子,无信号待机时app弹出一个倒计时菜单,这里当有信号接入时,app层要做出相应的反应。
a.  Supernova Client代码的实现(BpXXX):首先是实现IInterface类,IInterface类是实现Binder接口的基础类。
Supernova/projects/tvos/include/timermanager/ITimerManagerClient.
b.  调用代理对象的方法(BpXXX的方法)。代理对象通过transact发送数据出去
Supernova/projects/tvos/timermanager/libtimermanager/ITimerManagerClient.cpp
c.  服务器端的实现。实现IInterface基础类并重写onTransact方法,onTransact的实现已被MStar打包,位置在ics\frameworks\base\tv\libtv\libtimermanager.so
d.   
完整的调用过程是:
l  检测到有信号发送EV_DESTROY_COUNTDOWN消息
Supernova/projects/msrv/common/src/MSrv_Control_TV.cpp
BOOL MSrv_Control_TV::noSignalCheck_Handler(void)
{
     ……
     vtimer->PostEvent(NULL,EV_DESTROY_COUNTDOWN, NULL, NULL);
     ……
}
l  通过callback函数调用TimerManager的PostEvent函数
Supernova/projects/tvos/common/muf/MSrv.cpp

Supernova/projects/tvos/timermanager/libtimermanagerservice/TimerManagerService.cpp

l  调用BpXXX代理对象的方法,方法里通过Binder驱动传递数据
Supernova/projects/tvos/timermanager/libtimermanager/ITimerManagerClient.cpp

l  服务器端通过onTransact实现跟代理端的transact匹配
Framework/base/include/tv/timermanager/ITimerManagerService.h
Framework/base/tv/java/com/tvos/common/TimerManager.java
l  发送消息
Framework/base/tv/java/com/tvos/common/TimerManager.java
l  发送广播
Framework/base/policy/src/com/mstar/tv/service/TimerBinder.java


收藏
收藏0
分享
分享
点赞
点赞0
反对
反对0
该会员没有填写今日想 ...
回复

使用道具 举报

大神点评2

沙发#
creass 发表于:2016-9-28 12:04:16
hahaahhahaha!!123
回复

使用道具 举报

板凳#
Mike 发表于:2016-9-28 12:27:13
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
手机版