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. 本文只简单介绍 ...
随机推荐
- DATEDIF函数
DATEDIF(start_date,end_date,unit) DATEDIF函数是Excel隐藏函数,在帮助和插入公式里面没有. 返回两个日期之间的年\月\日间隔数.常使用DATEDIF函数计算 ...
- codevs 1013 求先序排列
题目链接:http://codevs.cn/problem/1013/ 题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度< ...
- Vivaldi浏览器媲美Chrome
Vivaldi跨平台的浏览器,很好的兼容性...基本上跟Chrome一个层次的... 好的东西,用一次就明白!好酒,酒香巷子深... Download: https://vivaldi.com/dow ...
- 你应该知道的HTTP基础知识
本文主要内容: HTTP请求报文格式 HTTP响应报文格式 Header 请求体的3种形式 推荐调试工具 HTTP的组成图示 1. HTTP请求报文格式 HTTP 的请求报文分为三个部分 请求行.请求 ...
- 阿里云设置CDN加速访问OSS文件
快速配置OSS:https://help.aliyun.com/document_detail/31885.html?spm=5176.doc31886.6.97.8iuJo5 快速配置CDN:htt ...
- stuff in /proc/PID/
Table of Contents 1. /proc/PID/cwd 2. /proc/PID/clear_refs 3. /proc/PID/coredump_filter 4. /proc/PID ...
- 无法启动程序,因为计算机丢失D3DCOMPILER_47.dll 的解决方法
这个原因应该是windows update在更新的时出现错误导致的 解决方法是安装 KB4019990 更新包. 网址如下:http://www.catalog.update.microsoft.c ...
- IOS的动态性
IOS的动态性主要来自以下方面的特性:动态类型,动态绑定,动态载入,SEL类型. 1.IOS的动态类型:(强类型)id可以在代码运行时判断对象的类型.使用id类型(又称强类型)可以在运行的时候使用任何 ...
- 【Struts2】Struts2获取session的三种方式
1.Map<String,Object> map = ActionContext.getContext().getSession(); 2.HttpSession session = S ...
- 【MySQL】MySQL的常规操作
MySQL的常规知识 标准的SQL语句通常可分为如下的几种类型: 1,DCL(Database Control Language) :数据控制语言,主要由grant和revoke关键字组成. 2.DD ...