Android学习-binder

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"));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值