Android系统学习总结之深入理解Binder

  1. Binder是Android系统提供的一种IPC(进程间通信)机制,由于Android是基于Linux内核的,因此,除了Binder以外,还存在其他的IPC机制,例如管道和socket等。
  2. Server进程要先注册一些Service到ServiceManager中,所以Server是ServerManager的客户端,而ServiceManager就是服务端了;
  3. 如果某个Client进程要使用某个Service,必须先到ServiceManager中获取该Service的相关信息,所以Client是ServiceManager的客户端;
  4. Client、Server、ServiceManager三者的交互都是基于Binder通信的。
  5. Process::self的作用:
    a) 打开/dev/binder设备,相当于与内核的Binder驱动有了交互的通道;
    b) 对返回的fd使用mmap,这样Binder驱动就会分配一块内存来接收数据;
    c) 由于ProcessState具有唯一性,因此一个进程只打开设备一次;
  6. defaultServiceManager函数的实现在IServiceManager.cpp中完成。它会返回一个IServiceManager对象,通过这个对象,我们可以神奇地与另一个进程ServiceManager进行交互。
  7. interface_cast不是指针的转换,而是利用BpBinder对象作为参数新建一个BpServiceManager对象。
  8. IServiceManager同时从IserviceManagerBBinder派生,表示它可以直接参与,
  9. BpServiceManager虽然是从BpInterface中派生,但是这条分支似乎与BpBinder没有关系;
  10. BnServiceManager是一个虚类,它的业务函数最终需要子类来实现。
  11. startThreadPool中新启动的线程通过joinThreadPool读取binder,查看是否有请求。主线程也调用joinThreadPool读取binder,查看是否有请求。
  12. Binder通信和基于Binder通信的业务之间的关系:
    a) Binder是通信机制;
    b) 业务可以基于Binder通信,当然也可以使用别的IPC方式通信;
  13. ServiceManager的作用:
    a) ServiceManager能集中管理系统内的所有服务,它能施加权限控制,并不是任何进程都能注册服务的;
    b) ServiceManager支持通过字符串名称来查找对应的Service;
  14. 将请求数据打包发送给Binder驱动,并由BpBinder中的handle值找到对应端的处理者处理,中间过程为:
    a) 通信层接收到请求;
    b) 递交给业务层处理;
  15. Binder和线程的关系,以MS为例,如果现在程序运行正常,此时MS则:
    a) 通过startThreadPool启动一个线程,这个线程在talkWithDriver;
    b) 主线程通过joinThreadPool也在talkWithDriver;
  16. 匿名Service就是没有注册的Service:
    a) 没有注册意味着这个Service没有在ServiceManager上注册;
    b) 它是一个Service又表示它确实是一个基于Binder通信的C/S结构;
发布了39 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43443900/article/details/103238697