Android binder驱动源码路径:kernel/drivers/staging/android/
Android binder头文件:/frameworks/native/include/binder/
Android binder实现源码:/frameworks/native/libs/binder/
Android Service Manager代码路径:/frameworks/native/cmds/servicemanager
Android JAVA 层ServiceManager代码路径:/framworks/base/core/java/android/os/ServiceManager.java
service manager是由init进程启动,管理binder进程间通信机制的上下文(context manager),且service manager也是一个特殊的service组件。
service manager启动:
1.调用binder_open打开设备文件/dev/binder ,申请128K内核缓冲区
2.调用binder_become_context_manager,将自己注册为binder进程间通信机制的上下文管理者
3.调用binder_loop来循环等待和处理client进程通信请求。
client获取service引用:
defaultServiceManager()获取ServiceManager代理对象
sp<IBinder> binder = defaultServiceManager()->getService(String16(XXX_SERVICE));
sp<IXXXService> service = IXXXService::asInterface(binder);
Service组件启动过程:
1.创建XXXService组件,并注册到ServiceManager中
defaultServiceManager()->addService(String16(XXXSERVICE),new XXXService())
2.启动一个Binder线程池,
3.将主线程加入到线程池,等待和处理client进程的通信请求
client和service端通信过程
1.client将请求数据封装成一个Parcel对象
2.client向Binder驱动启动发送BC_TRANSATION命令协议,Binder驱动找到目标Service进程后,发送BR_TRANSACTION_COMPLETE返回协议,client收到BR_TRANSACTION_COMPLETE,等待Service进程返回通信结果。
3.Binder驱动程序向Service进程发送BR_TRANSCTION返回协议,请求Service进程处理该进程通信请求;
4.Service进程处理完成后,发送BC_REPLY命令协议;Binder驱动通过协议内容找到client进程,并向Service进程发送BR_TRANSACTION_COMPLETE返回协议,Service接受到BR_TRANSACTION_COMPLETE后,结束本次通信,开始等待下一次通信请求
5.Binder向client进程发送一个BR_REPLY返回协议,并将进程间通信结果返回给client。
Binder在Java层应用:
ServiceManager通过BinderInteranl类的静态尘缘函数getContextObject创建一个句柄为0的Java服务代理对象,再通过ServiceManagerNative类的静态成员函数asInterface将Java服务代理封装成一个ServiceManagerProxy对象,保存在sServiceManager中
Java服务启动
在systemserver中,ServiceMannager.addservice("XXX",new XXXService());
Java服务代理对象获取
IXXXService xxxService = IXXXService.stub.asInterface(ServiceManager.getService("XXX"));