[Android]Binder学习笔记(一)

http://www.cnblogs.com/bastard/archive/2012/11/13/2766611.html

http://my.oschina.net/youranhongcha/blog/149575

1, Binder驱动的原理和实现
  Binder是作为一个字符设备存在,设备节点是/dev/binder,
  Binder底层驱动对应的源码文件是Kernel/drivers/staging/binder.h   Kernel/drivers/staging/binder.c

/sys/kernel/debug/binder/ 目录下的内容可以用来查看Binder设备的运行情况
 
 
sp <ProcessState> proc(ProcessState::self());这一句的含义是声明一个proc的变量,该变量是一个指向ProcessState类型的指针,
proc(ProcessState::self())是对proc的初始化~sp <ProcessState>表明了proc的类型


自己编写binder通信的步骤
1,sp <ProcessState> proc(ProcessState::self());
   创建一个ProcessState对象,android中每个进程都有一个processstate对象,ProcessState类中的mDriverFD表明的是打开/dev/binder返回的文件描述符,、
   并将返回的文件描述符映射到共享内存中,大小为2*1024*1024-4096*2
   mmap的使用实例:http://kenby.iteye.com/blog/1164700
  
2,创建IServiceManagerd对象
 sp<IserviceManager> sm=defaultServiceManager()
 ProcessState::self()->getContextObject(NULL)函数返回一个BpBinder,BpBinder和BBinder是一一对应的,都继承自IBinder,BpBinder是客户端用来
 与Server交互的代理类,p是proxy的意思,BBinder是与proxy相对的一端。Binder系统通过handle值来标识BBinder和BpBinder的
 interface_cast是利用BpBinder对象为参数新建了一个BpServiceManager对象,BpServiceManager的一个变量mRemote指向了BpBinder,
 综上:第二步主要做的操作有:创建一个BpBinder对象,它的handle值为0,创建一个BpServiceManager对象,它的mRemote值是BpBinder.
 
3, 创建具体的service
    如:MediaPlayerService::instance()
  void MediaPlayerService::instance()
  {
   defaultServiceManager()->addservice(String16("media.player",new MediaPlayerService())
  }
  由于defaultServiceManager返回的是BpServiceManager,所以这里相当于调用的是BpServiceManager的addservice()函数
  最终会调用到BpBinder::transact(uint32_t code,const Parcel&data,Parcel *reply,uint32_t flags)函数,
  该函数又会调用到IPCThreadState::self()->transact(mHandle,code,data,reply,flags)函数
  每个线程都有一个IPCThreadState,每个IPCThreadState中都有一个mIn,一个mOut,mIn用来接收来自Binder设备的数据,mOut用来存储发往Binder的数据
  真正最后和/dev/binder设备交互的是IPCThreadState::transact()函数,
  
4,ProcessState::self()->startThreadPool()
 startThreadPool中新启动的线程通过joinThreadPool读取binder设备,查看是否有请求
5,ProcessState::self()->joinThreadPool()
 主线程也通过joinThreadPool读取binder设备,查看是否有请求
 
 
二:servicemanager
 servicemanager对应的源码是ServiceManager.c的main()函数,
 (1)ServiceManager能集中管理系统内的所有任务,能增加权限控制,并不是任何进程都能注册服务的。
 (2)ServiceManager支持通过字符串名称来查找对应的Service,

二:Java层binder和Native层binder的交互
在android_util_Binder.cpp中有register_android_os_Binder()函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值