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
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()函数