您的位置:首页 > 其它

读安卓开发艺术探索和鸿洋博客有关于binder知识的笔记

2015-11-29 11:06 393 查看
首先贴上玉刚大神博客中安卓中binder的知识总结,如下就是玉刚大神的博客里面对进程间知识通信的总结:

摘要

Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2是对Binder机制进行深入底层乃至驱动的分析这一过程相当困难且相当耗时,因此并不适合重复造轮子。本文的角度是对Android的Binder机制从整体和概念上进行分析,能够让大家很快明白到底什么是Binder,Binder是干什么的,Binder和应用开发的关系是什么,总之,这篇文章还是很值得去看一看的。

什么是Binder

1. 直观来说,Binder是Android中的一个类,它继承了IBinder接口

2. 从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在linux中没有

3. 从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,etc)和相应ManagerService的桥梁

4. 从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务

为什么Android内核要使用Binder

Android中有大量的CS(Client-Server)应用方式,这就要求Android内部提供IPC方法,而linux所支持的进程通信方式有两个问题:性能和安全性。

目前linux支持的IPC包括传统的管道,System V IPC(消息队列/共享内存/信号量),以及socket,但只有socket支持Client-Server的通信方式,由于socket是一套通用的网络通信方式,其传输效率低下切有很大的开销,比如socket的连接建立过程和中断连接过程都是有一定开销的。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。

在安全性方面,Android作为一个开放式,拥有众多开发者的的平台,应用程序的来源广泛,确保智能终端的安全是非常重要的。终端用户不希望从网上下载的程序在不知情的情况下偷窥隐私数据,连接无线网络,长期操作底层设备导致电池很快耗尽等等。传统IPC没有任何安全措施,完全依赖上层协议来确保。首先传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用。可靠的身份标记只有由IPC机制本身在内核中添加。其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,system
V的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。

下面的笔记是给我自己肯定,大家绕行啊:::::::

安卓中关于aidl实现进程间通信相信大家应该都知道,首先新建一个安卓工程,

package com.zhy.calc.aidl;  

interface ICalcAIDL  

{  

    int add(int x , int y);  

    int min(int x , int y );
 

在里面声明一个.aidl结束的包,在里面生命一个接口的类,类里面的方法就是我们的业务方法。
http://blog.csdn.net/lmj623565791/article/details/38461079
我的笔记是参考鸿洋大神的博客写的,我们在service中去根据我们的需要实现我们的业务方法,当我们在自己的activity通过绑定service的方法拿到service的对象之后便可以获得一个binder的实例,这个实例就可以让我们去操作service中业务逻辑方法,在service中自己写的binder类会在bindeservice中获得实例给activity,在我们创建了aidl文件之后系统会给我们自动生成一个java类,其中的逻辑大家可以在鸿洋的博客中去查看,其中就是客户端通过binder对象,提交方法,这个方法是这个java类中的内部类中的一个对应业务逻辑方法名字的方法去调用服务端binder内部类的一个计算方法去实现的,这个方法会根据标志位来进行业务逻辑方法的区分来执行具体的方法,最后将结果返回给客户端的binder对象从而传递给activity的值,所以只要我们在servie服务器端自己写一个binder的类,其中写好接受参数的方法,自己写好处理逻辑,然后通过客户端的binder类中也写好请求业务逻辑的方法向服务器发出请求,服务器会根据参数执行对应的业务逻辑方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: