Android系统要创建一个service很简单,init 启动 rc 里的 可执行main (main_xxxserver.cpp)就可以了
但是,如果想要service被别的进程调用,就需要实现binder接口,并添加服务给ServiceManager,接受ServiceManager的管理和服务,才能支持client进程的跨进程调用。
要创建这个XXXService需要开发者手写这样几个文件:
1. aidl接口文件: IXXXService.aidl , 这里I表示Interface;aidl文件简要地指明你的服务要暴露什么业务功能接口(e.g. xxxFunc)给client进程
aidl会生成4个文件:
IXXXService.cpp
IXXXService.h :上面二者给client进程用
BpXXXService.h
BnXXXService.h :它给你自己的服务类库用
2.手写XXXService.h 注意前面没有I,XXXService.h 继承BinderService 和 BnXXXService,所以BnXXXService是给类库实现用的;
3.手写XXXService.cpp 注意这里配合2 就是你的XXXService类库,里面实现服务的业务功能
4.main_xxxserver.cpp在可执行main里注册服务
使用你的XXXService类的XXXService::instantiate();它继承父类BinderService的类instantiate(),最终会调用publish方法进行服务注册,有上面4样东西,再配置好selinux权限你的服务就成功添加到ServiceManager中了。
结果:你的client程序需要引用前面自动生成的IXXXService类库,注意前面有I,再经过如下过程:
//先获取IServiceManager
sp<IServiceManager> sm = defaultServiceManager();//你已向其注册你的服务
sp<IBinder> binder;
binder = sm->getService(String16("xxx.like"));//通过服务名称拿到代理对象
// 转换成IXXXService
sp<IXXXService> xxxService = interface_cast<IXXXService>(binder);
// 通过代理调用服务端业务功能接口函数
xxxService->xxxFunc();
总结,client开只认系统生成的带I的IXXXService类,方便系统管理。