1. Android进程间通信方式有哪些?
Linux中提供了很多进程间通信机制,主要有管道(pipe)、信号(sinal)、信号量(semophore)、消息队列(Message)、共享内存(Share Memory)、套接字(Socket)等。
Android系统是基于Linux内核的,在Linux内核基础上,又拓展出了一些IPC机制。Android系统除了支持套接字,还支持序列化、Messenger、AIDL、Bundle、文件共享、ContentProvider、Binder等。
建议参考:
学习Binder前必须要了解的知识点
深入理解Android进程间通信机制
2. Binder
2.1 Linux中各种IPC效率
两次拷贝的流程:
进程A和进程B的用户空间可以通过如下系统函数和内核空间进行交互。
- copy_from_user:将用户空间的数据拷贝到内核空间。
- copy_to_user:将内核空间的数据拷贝到用户空间。
2.2 Binder都包含什么?
- Client 客户端,一般为代理对象(如果客户端和服务端在同一个进程,真实Client端其实就是服务端对象,不再通过Binder驱动)
- Server 服务端,一般为服务提供方
- ServiceManager 负责Client和Server的管理,提供查询和注册服务
- Binder驱动 底层数据传输和映射
2.3 Binder优势:
- 一次内存拷贝
当Client端与Server端发送数据时,Client(作为数据发送端)先从自己的进程空间把IPC通信数据
copy_from_user拷贝到内核空间,而Server端(作为数据接收端)与内核共享数据,不再需要拷贝数据,而是通过内存地址空间的偏移量,即可获悉内存地址,整个过程只发生一次内存拷贝。 - 安全 Android 为每个安装好的APP分配了自己的UID,通过进程的UID来鉴别进程身份。另外,Android系统中的Server端会判断UID/PID是否满足访问权限,而对外只暴露Client端,加强了系统的安全性。
2.4 基于Binder的IPC有哪些?
AIDL、Messenger、ContentProvider
- AIDL的使用原理:Binder系列9—如何使用AIDL
2.5 常见问题
2.5.1 Binder线程池
Binder线程池:每个Server进程在启动时会创建一个binder线程池,并向其中注册一个Binder线程;之后Server进程也可以向binder线程池注册新的线程,或者Binder驱动在探测到没有空闲binder线程时会主动向Server进程注册新的的binder线程。对于一个Server进程有一个最大Binder线程数限制,默认为16个binder线程,例如Android的system_server进程就存在16个线程。对于所有Client端进程的binder请求都是交由Server端进程的binder线程来处理的。
所以Binder交互的过程中可能存在耗时,不要放在UI线程调用
2.5.2 AIDL怎么监听服务端kill掉了?
可以在客户端或服务端用linkToDeath添加监听。
建议参考:
Android多进程之Binder的意外死亡及权限校验
2.6 Binder源码解读
建议参考:
Binder系列—开篇
里面有Binder源码的一系列,写的非常好,建议通读学习。