android Binder的优点
Linux进程间通信的方式:
管道(Pipe)
信号(Signal)
消息队列(Message)
共享内存(Share Memory)
套接字(Socket)
中断
Binder
Binder 介绍:
Binder 通信机制是在OpenBinder的基础上实现的,采用CS通信方式。
OpenBinder是一种进程间通信机制,它最初是由Be公司开发的,后来由Palm公司接手开发和维护,最后Google公司对其进行改造,并应用在Android系统中
1、系统服务是用过getSystemService获取的服务,应用程序服务是通过继承Service,程序员自己创建的
2、Android的SDK中提供了aidl工具,该工具可以讲aidl文件转换为一个java类文件;例如我们定义一个IServer.aidl文件,aidl工具会自动生成一个IServer.java的java接口类(包含Stub,Proxy等内部类)。
3、前台进程通过bindService绑定后台服务进程时,onServiceConnected(ComponentName name, IBinder service)传回IBinder对象,并且可以通过IServer.Stub.asInterface(service)获取IServer的内部类Proxy的对象,其实现了IServer接口
4、前台进程实际上市通过Proxy实现的IServer接口方法,将方法名、参数传递给后台服务进程。
5、我们还需要继承Service,创建自己的后台服务进程,并且在其中实现IServer接口类,提供IServer的具体服务。并实现Service的onBind方法。 优点:
1、安全,传统的IPC(套接字、管道、消息队列)的安全机制依赖上层协议;例如:
a、Android为每个安装好的应用程序分配了自己的UID,故进程的UID是鉴别进程身份的重要标志。
b、传统IPC的接收方无法获得对方进程可靠的UID/PID(用户ID/进程ID),从而无法鉴别对方身份。
c、使用传统IPC只能由用户在数据包里填入UID/PID,但这样不可靠,容易被恶意程序利用,故可靠的身份标记只有由IPC机制本身在内核中添加。
d、其次传统IPC访问接入点是开放的,无法建立私有通道。比如命名管道的名称,system V的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。
2、性能高:传统的IPC(套接字、管道、消息队列)需要拷贝两次内存、Binder只需要拷贝一次内存、共享内存不需要拷贝内存。
信号:
、信号在最早的Unix系统中引入,用于在用户态进程间通信;内核也用信号通知进程系统所发生的事件。
2、信号是很短的消息。
3、信号可以发送到一个进程活着一组进程。
4、信号通常是由前缀SIG的宏标识的数字 使用信号的目的:
1、让进程知道已经发生了一个特定的事件
2、强迫进程执行它自己代码中的信号处理程序。(例如:子进程终止时发送给父进程的信号SIGCHLD)
消息队列:
、分为System V IPC 消息队列和POSIX 消息队列
2、基于文件的应用接口(mqueue的特殊文件系统,一个队列对应一个索引节点)
3、完全支持消息优先级
4、完全支持消息到达的异步通知,通过信号或者线程创建实现
5、用于阻塞发送与接收操作的超时机制。
6、小块数据
管道:
、所有Linux系统都愿意提供的一种进程间通信机制
2、是进程之间的单向数据流;从一个进程写入的所有数据,由内核定向到另一个进程读取;例如(ls | more === ls >temp ; more < temp)前者使用管道,后者使用临时文件
3、被看作打开文件,在文件系统中没有相应的映像。
4、半双工的;PS:Unix系统支持全双工的管道
5、父进程的管道可以通过fork给子进程使用
6、缺点是,除非是同一个父进程创建的管道,否则两个进程无法共享同一个管道。即:无法打开一个已经存在的管道。
7、为了解决上述6中的问题,采用了命名管道
FIFO:
、先进先出,先写入文件的字节总是被最先读出;
2、使用特殊的文件类型,在文件系统中不拥有磁盘块,打开的FIFO总是与内核缓冲区关联(存放多个进程之间交换的数据)。
3、Linux2.6 中 FIFO和管道基本相同,使用相同的数据结构(pipe_inode_info)
区别:
1、FIFO索引节点出现在系统目录树上,而不是pipefs特殊文件系统
2、FIFO是一种双向通信管道;即可以以读、些模式打开一个FIFO,而管道时单向的
共享内存:
、
套接字:
、android zygote 创建App进程,就是通过监听本地Socket,接收服务进程的命令来实现的
2、使用特殊的文件
3、双向通信
4、不依赖父进程,只要知道套接字名称,就可以使用
中断:
、是一个事件,对应CPU芯片内外部硬件电路产生的电信号。
2、分为同步中断(指令执行结束,CPU控制单元产生并且发出的中断)、异步中断(其他硬件设备按照CPU时钟信号随机产生)
3、分为上半步(接收中断)、下半步(处理中断,比较费时);
android Binder的优点的更多相关文章
- Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 图文详解 Android Binder跨进程通信机制 原理
图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...
- [转]Android Binder设计与实现 - 设计篇
摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...
- (转)Android Binder设计与实现 – 设计篇
原文地址(貌似已打不开):Android Binder设计与实现 – 设计篇 ------------------------------------------------------------- ...
- 图解Android - Binder 和 Service
在 Zygote启动过程 一文中我们说道,Zygote一生中最重要的一件事就是生下了 System Server 这个大儿子,System Server 担负着提供系统 Service的重任,在深入了 ...
- Android Binder设计与实现 - 设计篇
要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具 ...
- Android Binder机制详解:手写IPC通信
想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- ANDROID BINDER机制浅析
Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍 ...
随机推荐
- 另一鲜为人知的单例写法-ThreadLocal
另一鲜为人知的单例写法-ThreadLocal 源代码范例 当我阅读FocusFinder和Choreographer的时候,我发现这两类的单例实现和我们寻经常使用双重检查锁非常不一样.而是用来一个T ...
- 【Excle】一个比VLOOKUP牛的函数LOOKUP
1.根据时间查找最近发生的交易 2.多条件查找 3.反向查找 4.模糊匹配 上述例子充分说明了LOOKUP的查找特技,点击下载上述案例对应的Excle
- 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock
JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...
- 解码url参数的lotusscript函数
在Domino的系统开发过程中,我们往往要通过url来进行传参,传递参数给表单或者代理,假如浏览器请求的url带有参数,在交给服务器前服务器会对其进行编码(不知道这样理解对不对),像一些特殊符号,空格 ...
- OpenCV学习代码记录——Hough线段检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- Intent传递数据全解
概述 之前的博文也有介绍,查看-->用户界面开发基础 这里单独抽取出来,更加具体的记录一下,事实上主要是API的使用. Intent传递简单数据 能够以直接通过调用Intent的putExtra ...
- Spring MVC 教程,快速入门,深入分析[1-11]
资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com ...
- Mac终端查看sqlite3数据库、表数据等(含sqlite可视化工具下载)
背景: 有时候,我们在用FMDB等库处理iOS数据库时,沙盒里保存的数据库格式为.sqlite3. 那么,我们如何查看这个数据库呢? 其实有两种方法: 1.借助工具 - Sqlite Database ...
- SQLserver视图修改sql
语法: alter view dbo.视图名 as 更新后的视图SQL go 举个栗子: 原视图名为YOUR_VIEW其中SQL为: select * form TableA 更新视图: alter ...
- 数据结构学习之stack
不能小看这些基本的数据结构,写了才发现还是会有问题出现的. 有码有真相: #pragma once class MyStack { public: MyStack(void); ~MyStack(vo ...