Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及Binder驱动。其中Server,Client,SMgr运行于用户空间,驱动运行于内核空间。这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。
1.智能指针
2.进程间的数据传递载体——parcel
parcel的实现在/framews/base/core/jni中
2.1parcel设置相关
parcel的相关方法:
datasize():获取当前已经存储的数据大小
setdatacapacity(int size):设置parcel的空间大小,存储的数据不能大于这个值
setDataPosition(int pos);改变Parcel中的读写位置,必须介于0和dataSize()之间。
dataAvail():当前Parcel中的可读数据大小。
dataCapacity():当前Parcel的存储能力。
dataPosition():数据当前位置值,类似游标。
2.2Primitives
原始类型数据的读写操作。
2.3Primitive Arrays
原始数据类型数组的读写操作通常是先写入用4个字节表示的数据大小值,接着才写入数据本身。另外用户既可以选择将数据读入现有的数组中,也可以让Parcel返回一个新的数组。
2.4Parcelables
遵循Parcelable协议的对象可以通过Parcel来存取,如开发人员经常用到的bundle就是继承自Parcelable的,相关方法:
writeParcelable(Parcelable,int):将这个Parcelable 类的名字和内容写入Parcel中,实际上他是通过回调此Parcelable的writeToParcel()方法来写入数据。
readParcelable(ClassLoader):读取并返回一个新的Parcelable对象。
writeParcelableArray(T[ ],int):写入Parcelable对象数组
readParcelableArray(ClassLoader):读取并返回一个Parcelable对象数组。
2.5Bundles
上面提到,Bundle继承自Paracelable,是一种特殊的type-safe的容器。Bundle的最大特点就是采用键值对的方式存储数据,并在一定程度上优化了读取速率。这个类型的Parcel操作:
writeBundle(Bundle):将Bundle写入parcel.
readBundle():读取并返回一个新的Bundle对象
readBundle(ClassLoader):读取并返回一个新的Bundle对象,ClassLoader用于Bundle获取对应的Parcelable对象
2.6Active Objects
Parcel的另一个强大的武器就是可以读写Active Objects--------------通常我们存入Parcel的对象的内容,而Active Objects写入的则是他们的特殊标志引用。
所以在从Parcel中读取这些对象时,大家看到的并不是重新穿件的对象实例,而是原来那个被写入的实例。
(1)Binder一方面是
Android
系统IPC通信的核心机制之一,另一方面也是一个对象。利用Parcel将Binder对象写入,读取时就能得到原始的Binder对象,或者是它的特殊代理实现:
writeStrongBinder(IBinder)
writeStrongInterface(IBinder)
readStrongBinder()
(2)FileDescriptor。FileDescriptor是
Linux
中的文件描述符,可以通过Parcel的方法为:
writeFileDescriptor(FileDescriptor),readFileDescriptor()
因为传递后的对象仍然会基于和原对象相同的文件流进行操作,因而可以认为是Active Object的一种
2.7Untyped Containers
它是用于读写标准的任意类型的
Java
容器
writeArray(Object[ ])
readArray(ClassLoader)
writeList(List)
readList(List,ClassLoader)
3Binder驱动与协议
是binder的地基
Android系统将binder注册成msic device类型的驱动(杂项设备)
4“DNS”服务器-ServiceManager(Binder Server)
4.1ServiceManager的启动
在init程序解析init.rc时启动
4.3获取ServiceManager服务
核心工作:
打开binder设备
执行mmap
通过binder驱动向SM发送请求
获得结果
IPCThreadState负责与Binder驱动进行具体的命令交互(processState只是负责打开了Binder节点并做mmap),因而它的transact函数非常重要
未完。。。