前言
Binder对于Android开发,很熟悉,也很陌生。我也经常用,但对其原理不是很了解,因此参考其他大佬的,做一下笔记。
简单记录一下Android中Binder的原理(其实主要摘抄),方便自己回顾。
正文
什么是Binder
Binder是Android中的一种跨进程通信(IPC)的方式。
为啥选择Binder
Android上主要从以下几点考虑
性能:Binde在数据拷贝只拷贝一次,而管道、消息队列、Socket都需要两次,共享内存不需要拷贝。Binder的性能仅次于共享内存。
稳定性:Binder基于C/S架构,客户端与服务端彼此独立,稳定性较好。而拷贝性能更好的共享内存,存在并发同步问题,容易出现死锁和资源竟争,稳定性较差。
安全性:注册服务时,Binder会分配唯一的UID,用来鉴别进程的标志,如果服务是恶意软件启动的服务,那么可以通过UID找到服务并进行禁止。传统IPC是由服务自己往数据包里填入UID/PID去告知内核,这个标记完全是在用户空间控制的,存在恶意篡改的可能。因此Binder的安全性更高。
原理
上面也说了Binder是基于C/S架构,也就是一个Client端,一个Server端。
虚线就是代表Client、Server不是直接与ServiceManager直接交互,而是通过Binder驱动
注册服务
Server进程向Binder驱动发起服务注册请求
Binder驱动将注册请求转发给ServiceManager进程
Server进程信息添加到ServiceManager
注册成功后,ServiceManager进程拥有Service进程的信息。
获取服务
Client进程想Binder驱动发送获取服务请求,传递需要获取的服务名称
Binder驱动将该驱动请求转发给ServiceManager进程
ServiceManager查找对应的服务信息
通过Binder驱动将上述服务信息返回给Client进程
PS: Client进程获取到的是Server的代理对象
使用服务
Client进程发送数据到Server进程
Server进程根据Client进程的请求进程执行对应的方法
Server进程将对应方法的结果返回给Client进程
参考文章
《Android插件化开发指南-包建强》
《》
《》