0%

Android-binder总结

一些描述性的总结,大多数前面两篇已经描述过了

进程结构:

binder_16

binder_proces 是保存在binder驱动中的一个全局的链表

binder_16

注册服务的时候,会在service_manager中创建ref,在服务的进程中创建node,客户进程请求服务的时候会在自己的进程创建ref,都保存在各自的proc的红黑树的结构中

binder_13

数据流向

  1. BBinder会转成一个flat_binder_object,然后加上 name 序列化到 Parcel里
  2. 然后加上 target= 0和code=ADD_SERVICE 转成 binder_transation_data 对象,
  3. 然后加上 cmd = BC_TRANSACTION 写入到IPC_ThreadState的mOut 里面,mOut和mIn 构造一个 binder_write_read 对象, 发送给 binder 驱动
  4. binder 驱动拷贝这个数据到内核,构造一个 binder_transaction_data 发送给服务进程的todo队列,同时向用户进程回复BR_COMPLETE
  5. 服务进程构造 binder_transaction_data 和 BC_REPLY 回复给 binder 驱动

请求过程

binder_13

传输数据的大小限制

取决于binder_open的参数:

  1. ServiceManager 初始化的时候传入的是 128*1024,也就是128k, 这个我们用不上
  2. 其他系统服务初始化的时候传入的是 BINDER_VM_SIZE(1*1024*1024-4096*2),也就是 1M-8K

系统服务与bindService等启动的服务的区别

binder_20

深入理解Binder通信原理及面试问题
Binder系列10—总结