SuperIC社区_
标题: Android Binder [打印本页]
作者: sean 时间: 2016-9-28 11:32
标题: Android Binder
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
作者: creass 时间: 2016-9-28 12:04





作者: Mike 时间: 2016-9-28 12:27


欢迎光临 SuperIC社区_ (/) |
Powered by Discuz! X3.3 |