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
|