Android中Binder的基础知识点
Android Binder基础知识点
一 传统IPC和Binder机制的比较
传统IPC:
1)收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份。
2)接入点开放,无法建立私有通道。
3)socket, 管道和消息队列需要两次数据拷贝,传输效率差。
4)共享内存的方式控制复杂,难以使用。
Binder机制:
1)为发送方添加UID/PID身份。
2)既支持实名Binder也支持匿名Binder。
3)传输过程只需要一次拷贝。
二 Binder中的面向对象思想
Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,它的引用却遍布与系统的各个进程之中。这个引用和java里的引用一样,可以使强类型也可以使弱类型,而且可以从一个进程传递给其他进程。
三 Binder的通信模型
用户空间:Server,Client,ServiceManager;内核空间:Binder驱动。
Binder驱动:和硬件没有关系,但实现方式和设备驱动一样,工作于内核态,用户通过/dev/binder访问它。
ServiceManager:和DNS类似,将字符形式的Binder名字转化成Client中对该Binder的引用。
Server:Server到ServiceManager的通信也是Binder实现,Server通过固定的0引用来获取ServiceManager的Binder引用。
Client:Client通过名字获取Server注册的Binder引用。这些指向Binder的引用是强类型,从而确保只要有引用Binder实体就不会被释放掉。Client和Server直接还可以通过实名Binder发送匿名Binder,别的进程无法通过穷举或猜测获取匿名Binder的引用。
四 通过AIDL使用Binder
Android会将AIDL文件转化成一个IInterface接口,接口内会有一个实现此接口并继承Binder的Stub存根类,Server通过Stub的具体实现类来提供一系列的业务操作。
Stub的内部会有一个继承Stub的Proxy代理类,Client通过Stub的asInterface方法获取Proxy的实例,来远程访问Server提供的方法。
这是一个典型的存根-代理模式,使得上层代码不用考虑IPC的底层实现细节。
另外,AIDL接口除了传递Java基本类型外,还可以传递任何实现Parcelable接口的复杂类型。AIDL接口还可以传递另一个AIDL接口,注意,这本质上就是一个匿名Binder,Server可以通过Client传递的AIDL接口反向调用Client中的方法,在这里要注意内存溢出的问题。
Android中Binder的基础知识点的更多相关文章
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- Android中的一些基础知识(二)
这几天在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细,这里我只是翻译 ...
- Android中的Service基础
Service主要用于后台程序和跨进程访问,可以在不显示界面的前提下完成任务,不影响用户的其他操作. 这里我展示一些基本的用法 新建一个Service类 package com.example.ser ...
- 阿里面试官:Android中binder机制的实现原理及过程?
Binder 是 Android 系统中非常重要的组成部分.Android 系统中的许多功能建立在 Binder 机制之上.在这篇文章中,我们会对 Android 中的 Binder 在系统架构中的作 ...
- Android中的一些基础知识(一)
翻译自这里,并做了部分修改. 什么是Android? Android是为移动设备提供的软件,它包括操作系统.中间件.和一些关键的应用程序.应用程序执行它自己的进程和在Dalvik虚拟机中的实例. An ...
- Android中的一些基础知识(三)
最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...
- Android中webView的基础使用(一)
WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version=& ...
- Android中View的基础知识
View的界限 View就是我们看到的界面,有四个界限范围分别是, Top/Left, Bottom/Right,坐标系从左上到右下.这四个值可以通过任何View的子类调用getTop()/get.. ...
- Android 中基于 Binder的进程间通信
摘要:对 Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 ...
随机推荐
- js获取上传文件扩展名
File_box.value.substring(File_box.value.lastIndexOf(".") + 1);
- JDBC 异常特殊原因 (数据库只读解决办法)
JDBC 异常特殊原因 有时候并不是因为程序写的有问题 ,是因为 数据库只读 在sqlserver2005中附加数据库时,附加的数据库会变成只读的,只能进行查询操作. 解决方法: 1 打开Sq ...
- VC中遍历进程并获取进程信息
代码如下: /***************************************************/ /* 函数: 遍历进程信息 /* 参数:进程名称 例如: aaa.exe /* ...
- #JavaScript对象与继承
JavaScript对象与继承 JavaScript是我在C语言之后接触的第二门编程语言,大一暑假的时候在图书馆找了一本中国人写的JavaScript程序设计来看.那个时候在编程方面几乎还是小白,再加 ...
- CoreData的数据迁移
CoreData的数据迁移 很多人说CoreData坑多,现在才感觉到,今天上午写代码的时候,发现了一个大问题. 过程如下,之前我自己给coredata的实体添加了几个字段,后来网上的一个用户说我 ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
- 行为级和RTL级的区别(转)
转自:http://hi.baidu.com/renmeman/item/5bd83496e3fc816bf14215db RTL级,registertransferlevel,指的是用寄存器这一级别 ...
- C51函数的递归调用
前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...
- 逻辑数据库设计 - 需要ID(谈主键Id)
本文的目标就是要确认那些使用了主键,却混淆了主键的本质而造成的一种反模式. 一.确立主键规范 每个了解数据库设计的人都知道,主键对于一张表来说是一个很重要,甚至必需的部分.这确实是事实,主键是好的数据 ...
- Sql Server 面试题
1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81张三 数学 75李四 语文 ...