Android--Binder
2016-07-24 21:36
369 查看
热,热,热
Binder的设计采用了面向对象的思想,在Binder通信模型的四个角色里面;他们的代表都是“Binder”
对于Server进程来说,Binder指的是Binder本地对象
对于Client来说,Binder指的是Binder代理对象,它只是Binder本地对象的一个远程代理;对这个Binder代理对象的操作,会通过驱动最终转发到Binder本地对象上去完成;对于一个拥有Binder对象的使用者而言,它无须关心这是一个Binder代理对象还是Binder本地对象;对于代理对象的操作和对本地对象的操作对它来说没有区别。
对于传输过程而言,Binder是可以进行跨进程传递的对象;Binder驱动会对具有跨进程传递能力的对象做特殊处理:自动完成代理对象和本地对象的转换。
首先传统IPC的接收方无法获得对方进程可靠的UID和PID(用户ID进程ID),从而无法鉴别对方身份。
Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。
使用传统IPC只能由用户在数据包里填入UID和PID,但这样不可靠,容易被恶意程序利用。
可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,systemV的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。
ServiceManager建立
各个Server向SM注册
Client想要与Server通信,首先询问SM,Server的地址是什么,Client收到地址后之后,链接Server,于是就开始通信了。
IInterface代表的就是远程server对象具有什么能力。具体来说,就是aidl里面的接口。
Java层的Binder类,代表的其实就是Binder本地对象。BinderProxy类是Binder类的一个内部类,它代表远程进程的Binder对象的本地代理;这两个类都继承自IBinder, 因而都具有跨进程传输的能力;实际上,在跨越进程的时候,Binder驱动会自动完成这两个对象的转换。
在使用AIDL的时候,编译工具会给我们生成一个Stub的静态内部类;这个类继承了Binder, 说明它是一个Binder本地对象,它实现了IInterface接口,表明它具有远程Server承诺给Client的能力;Stub是一个抽象类,具体的IInterface的相关实现需要我们手动完成,这里使用了策略模式。
具体看原文分析
Proxy implements IInterface (是Stub的内部类,局部变量持有Binder)
是不是同一个进程,用什么,通过asInterface(android.os.IBinder obj)方法
data:取出目标方法的参数
参考:
http://weishu.me/2016/01/12/binder-index-for-newer/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
http://blog.csdn.net/boyupeng/article/details/47011383
Binder
4000Linux中的用户空间和内核空间
Binder是什么?
通常意义下,Binder指的是一种通信机制;基于Client-Server通信模式,传输过程只需一次拷贝,为发送方添加UID/PID身份,既支持实名Binder也支持匿名Binder,安全性高。Binder的设计采用了面向对象的思想,在Binder通信模型的四个角色里面;他们的代表都是“Binder”
对于Server进程来说,Binder指的是Binder本地对象
对于Client来说,Binder指的是Binder代理对象,它只是Binder本地对象的一个远程代理;对这个Binder代理对象的操作,会通过驱动最终转发到Binder本地对象上去完成;对于一个拥有Binder对象的使用者而言,它无须关心这是一个Binder代理对象还是Binder本地对象;对于代理对象的操作和对本地对象的操作对它来说没有区别。
对于传输过程而言,Binder是可以进行跨进程传递的对象;Binder驱动会对具有跨进程传递能力的对象做特殊处理:自动完成代理对象和本地对象的转换。
为什么使用Binder?
性能和安全首先传统IPC的接收方无法获得对方进程可靠的UID和PID(用户ID进程ID),从而无法鉴别对方身份。
Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。
使用传统IPC只能由用户在数据包里填入UID和PID,但这样不可靠,容易被恶意程序利用。
可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,systemV的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。
Binder通信模型:
ServiceManager建立
各个Server向SM注册
Client想要与Server通信,首先询问SM,Server的地址是什么,Client收到地址后之后,链接Server,于是就开始通信了。
SM整个系统就一个,Binder驱动也只有一个
Binder机制跨进程原理
建议看原文
深入理解Java层的Binder
IBinder是一个接口,它代表了一种跨进程传输的能力;只要实现了这个接口,就能将这个对象进行跨进程传递;这是驱动底层支持的;在跨进程数据流经驱动的时候,驱动会识别IBinder类型的数据,从而自动完成不同进程Binder本地对象以及Binder代理对象的转换。IInterface代表的就是远程server对象具有什么能力。具体来说,就是aidl里面的接口。
Java层的Binder类,代表的其实就是Binder本地对象。BinderProxy类是Binder类的一个内部类,它代表远程进程的Binder对象的本地代理;这两个类都继承自IBinder, 因而都具有跨进程传输的能力;实际上,在跨越进程的时候,Binder驱动会自动完成这两个对象的转换。
在使用AIDL的时候,编译工具会给我们生成一个Stub的静态内部类;这个类继承了Binder, 说明它是一个Binder本地对象,它实现了IInterface接口,表明它具有远程Server承诺给Client的能力;Stub是一个抽象类,具体的IInterface的相关实现需要我们手动完成,这里使用了策略模式。
具体看原文分析
总结:
Stub extends Binder implements IInterfaceProxy implements IInterface (是Stub的内部类,局部变量持有Binder)
是不是同一个进程,用什么,通过asInterface(android.os.IBinder obj)方法
onTransact方法
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { ... }
参数解释
code:标识请求的哪一个方法data:取出目标方法的参数
参考:
http://weishu.me/2016/01/12/binder-index-for-newer/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
http://blog.csdn.net/boyupeng/article/details/47011383
相关文章推荐
- Android之手势交互的详解
- 开发日记——手机安全卫士 Day03 2016-7-22 实现手机SIM卡绑定功能,添加安全号码功能
- Android首字母索引排序通讯录
- 避免陷入过度设计的泥潭
- Android四大组件
- android背景音乐播放
- android broadcastReceiver 常用的广播
- Android之Handler用法总结
- Android数据库安全解决方案,使用SQLCipher进行加解密
- Android应用与MVP模式
- android底层库libutils之string8,string16研究
- Android中使用Handler造成内存泄露的分析和解决
- Android之控制手机屏幕熄灭(距离传感器)
- 开发日记——手机安全卫士 Day02 2016-7-21 完成导航页面和切换功能
- Android 事件总线OTTO用法快速入门
- Android 移动开发--遇到问题及解决(一)
- Android群英传之Android 滑动分析
- Android之调节手机屏幕亮度
- Adb-for-test简单使用
- Android照片墙加强版,使用ViewPager实现画廊效果