binder系统架构
如上图系统架构主要有4部分构成
1、binder驱动,为binder提供底层操作函数,主要函数是ioctl()
2、serviceManager:这是有deamon,为binder提供查询,注册等功能,对于binder服务,通常使用唯一的字符串作为标识。
3、binder服务端:binder服务的提供者
4、binder客户端:binder服务的使用者
一、层次设计
如上图所示,binder的层次关系图可分为三个部分,
最上层为framework的各种binder服务类和接口类。
最底层的为binder驱动,主要提供了open,ioctl和close这三个接口。
中间两层分别为binder核心类和IPCThreadState,
binder核心类提供Ibinder和Bbinder和Bpbinder,IPCThreadState提供了与Bnbinder和Bpbinder的在驱动层的交互接口。
所以:从整体上来说,分为两层比较合适,运用层为framework的服务类和接口类以及为它提供基础功能的binder核心类,我们可以将这一层叫做binder的运用逻辑层,而IPCThreadState和驱动可以叫做数据链路层,主要提供硬件业务员的交互。
二、binder服务的使用
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService("xxx");//查找已经注册名为"xxx"的binder服务,返回IBinder的引用对象
ICameraService service = ICameraService.stub.asInterface(binder);//,实际使用的时候需要将这个引用对用转换为代理对象。
用defaultServiceManager()来获取serviceManager服务的引用对象,然后调用getService来获取注册了的Binder服务,如果查找到名称对应的服务则返回该服务的IBinder,否则返回NULL。IBinder是一个引用对象,实际使用的时候,需要将引用对象转为为代理对象方可使用:
想一下、既然defaultServiceManager()可能会不存在返回NULL,我们为什么没有判断它的返回值勒?
答: ServiceManager会在运用启动之前启动,而且不会停止,所以我们可以不用检查返回值为NULL的情况。
三:java开发binder服务
第一步:编写aidl文件。
interface IExampleService{
int get();
void set(int value);
};
aidl解析器会根据我们编写接口来自动生成服务器和客户端的java代码。
第二步:编写server的代码
public class ExampleService extends Service{
int mValue;
private final IExampleService.Stub mInstance = new IExampleService.Stub(){
public int get(){
return mValue