Android中Binder机制的理解

Android中每个应用都是出于独立的进程中运行了,都有独立的UUID,这样保证了应用的独立性和安全性,而每个进程又分为,用户空间和内核空间,用户空间和内核空间之间相互隔离,用户空间的数据不可共享,而内核空间的数据可以实现共享。

实现IPC跨进程通信,即内核空间之间的数据共享,涉及到,Client,Server,ServiceManager,Binder驱动,其中,Client,Server,ServiceManager处于用户空间,Binder驱动处于内核空间,Binder驱动和ServiceManager属于Android的基础架构,Client和Server需要用户自己实现。

主要实现过程:Server在ServiceManager进程注册,Client通过ServiceManager获取Server的引用,从而得到Binder进行数据的交互。

Service端通过Binder驱动在ServiceManager的查找表中注册Object对象的add方法

Client端通过Binder驱动在ServiceManager的查找表中找到Object对象的add方法,并返回proxy对象的add方法,add方法是个空实现,proxy对象也不是真正的Object对象,是通过Binder驱动封装好的代理类的add方法

当Client端调用add方法时,Client端会调用proxy对象的add方法,通过Binder驱动去请求ServiceManager来找到Service端真正对象,然后调用Service端的add方法

其中Binder维护着自己的一个线程池,最大线程数为16,超过则会发生阻塞,

在使用IPC跨进程通信时,会更加的高效,数据只会Copy一次(通过映射的物理地址),由于数据在内核空间进行,所以不需要额外的同步处理,还更加安全,binder机制为每个进程分配了UID/PID,进行鉴定身份的标示,在通信是进行检测。

详细实现过程:

1,在AndroidStudio新建一个AIDL文件,定义好接口和参数

2,新建一个Server在里面实现AIDL文件的接口实现

3,在配置文件中注册该Server并添加到独立的进程中

4,将AIDL文件copy到客户端,在客户端注册实现该Server

根据原理实现的Demo如:https://github.com/zdc212133/AIDLSimple

你可能感兴趣的:(Android中Binder机制的理解)