本文最后更新于 879 天前,其中的信息可能已经有所发展或是发生改变。
1. 整体框架
1.1 底层接口 open,mmap,ioctl
- open:打开设备节点
- mmap:分配共享区域
- ioctl:对共享内存读写数据,并且是一些binder调用的事务管理。
1.2 中层接口
ProcessState和IPCThreadState
ProcessState是一个singleton类,每个进程只有一个对象,这个对象负责打开Binder驱动,开辟一个共享空间,建立线程池,让其进程里面的所有线程都能通过Binder通信
每个线程都有一个IPCThreadState实例登记在Linux线程的上下文附属数据中,主要负责Binder的读取,写入和请求处理框架。
– ProcessState和IPCThreadState 是基本基础的
– 在上述基础native封装了 BpBinder和BBinder
– 在上述基础封装以便java层调用 即 Binder
2. 实名Binder和匿名Binder
- 实名Binder利用的通信接口就是ServiceManager这个最原始的接口getServcie,addService
- 匿名Binder利用的通信接口就是工程师自己实现的setCallBack。
- Binder(服务端)和BinderProxy(客户端)成对出现,服务端和客户端在同一进程中,Binder驱动为了性能会自动返回Binder对象而不是BinderProxy
3. Binder通信最大可以传输多大的数据
- mmap限制了4M
- 如果一个进程使用ProcessState这个类来初始化Binder服务,这个进程的Binder内核内存上限就是BINDER_VM_SIZE,也就是1MB-8KB