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的基础知识点的更多相关文章

  1. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  2. Android中的一些基础知识(二)

    这几天在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细,这里我只是翻译 ...

  3. Android中的Service基础

    Service主要用于后台程序和跨进程访问,可以在不显示界面的前提下完成任务,不影响用户的其他操作. 这里我展示一些基本的用法 新建一个Service类 package com.example.ser ...

  4. 阿里面试官:Android中binder机制的实现原理及过程?

    Binder 是 Android 系统中非常重要的组成部分.Android 系统中的许多功能建立在 Binder 机制之上.在这篇文章中,我们会对 Android 中的 Binder 在系统架构中的作 ...

  5. Android中的一些基础知识(一)

    翻译自这里,并做了部分修改. 什么是Android? Android是为移动设备提供的软件,它包括操作系统.中间件.和一些关键的应用程序.应用程序执行它自己的进程和在Dalvik虚拟机中的实例. An ...

  6. Android中的一些基础知识(三)

    最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...

  7. Android中webView的基础使用(一)

    WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version=& ...

  8. Android中View的基础知识

    View的界限 View就是我们看到的界面,有四个界限范围分别是, Top/Left, Bottom/Right,坐标系从左上到右下.这四个值可以通过任何View的子类调用getTop()/get.. ...

  9. Android 中基于 Binder的进程间通信

    摘要:对  Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 ...

随机推荐

  1. (转)[老老实实学WCF] 第四篇 初探通信--ChannelFactory

    第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了.我们不禁感叹WCF ...

  2. Java性能漫谈-数组复制之System.arraycopy

    当我还年幼的时候,我很任性,复制数组也是,写一个for循环,来回倒腾,后来长大了,就发现了System.arraycopy的好处. 为了测试俩者的区别我写了一个简单赋值int[100000]的程序来对 ...

  3. unison实时双向数据同步

    软件下载 ocamlopt下载地址:http://caml.inria.fr Unison下载地址:http://www.seas.upenn.edu/~bcpierce/unison 1.安装uni ...

  4. QT5-控件-QComboBox

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QComboBox> cl ...

  5. C#中弹出新窗口

    1.在主窗体程序中定义对应别的窗体的对象 Form_a_class form1 = Form_a_class  test_delegate(); 2.调用显示 form1.ShowDialog();

  6. jQuery中的插件的编写和使用

    1,常用的jQuery插件:表单验证插件formValidator a.目前支持5大验证方式:1.inputValidator(针对input,textarea,select控件的字符长度,值范围,选 ...

  7. PHP面向对象编程快速入门

    面向对象编程(OOP)是我们编程的一项基本技能,PHP4对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就通 ...

  8. mongodb的连接问题,绑定IP惹的祸

    刚刚安装好了 mongodb .对着 mongodb in action上的例子敲了下面的代码: public class TestDBConnect { @Test public void test ...

  9. 安装apache服务器时遇到只能本地访问,局域网内其他电脑不能访问apache:

    安装apache服务器时遇到只能本地访问,局域网内其他电脑不能访问apache:1.查看selinux运行状态及关闭selinux/usr/sbin/sestatus -v文本模式关闭selinux: ...

  10. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)

    3. prefetch_related() 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化.或许你会说,没有一个叫OneToMan ...