Linux内核的基础知识:

  • 进程隔离/虚拟地址空间:在操作系统中为了保护某个进程互不干扰就设计了一个叫“进程隔离”的技术,防止进程A可以操作进程B的数据。而进程隔离技术用到了虚拟地址空间,进程A的虚拟地址空间跟进程B的虚拟地址空间其实是不同的,而如果进程与进程之间要进行通知则需要某种通信机制才能完成,在android里面就是binder通信机制。
  • 系统调用:因为系统对内核存在某种保护机制来告诉应用程序你只可能访问某些许可的资源,不许可的资源是不能被访问的,也就是把Linux的内核层与应用层抽象隔离,也就是内核层和用户空间,用户可以通用系统调用在用户空间去访问内核的某些程序。
  • binder驱动:在android系统中它是运行在内核空间当中,它负责各各用户进程通过binder通信的内核进行交互的一个模块则为binder驱动。可以通过它来访问硬件。

Binder通信机制介绍:

  • 为什么要使用Binder?

    a、Android使用的Linux内核拥有着非常多的跨进程通信机制,如:管道、socket等,那为什么Android还要特意搞个Binder通信机制呢?主要是以下两点的考虑:
    b、性能:移动设备中如果广泛的使用跨进程通信机制肯定会对通信机制提出严格的要求,而Binder相比较传统的进程通信方式更加的高效。
    c、安全:由于传统进程通信方式没有对通信的双方和身方做出严格的验证,只有上层协议才会去架构,如socket连接的IP地址可以人为的伪造。而Binder身份校验也是android权限模式的基础。

  • binder通信模式:

    a、电话基站:binder驱动
    b、通信录:serviceManager

    这里用一个比较形像的例子来说明上面的通信录和电话基站在binder通信模型中的作用:A同学要给B同学打电话,首先A同学会去从通讯录中找到B同学的电话号码,而serviceManager驱动的角色就相当于这里说到的通讯录,存了通信双方的一些类似电话号码可以去识别对方的东东,但是找到电话号码要想打通对方,还需要电话基站的支持,电话基站是用来传替双方信号的,所以binder驱动就相当于电话基站。下面用图来说明:

    图解一下流程:这里是Client要向Server2进行通讯,首先Server2需要向serverManager进行电话号码的注册,当然里面是存放的Server2的内存地址;然后serviceManager会去注册表来保存同学的名字与电话号码,最后则进行通讯,也就是Client会去serviceManger查询Server2的联系方式,当serviceManager收到查询通知之后则会告诉Client Server2的联系方式,然后Clinet就可以通过Binder和Server2进行通信啦。
    那Binder是如何进行跨进程间通讯的呢?继续看下面一张图:

    如图所示,Client想调用Server端的返回值为Object类型的add方法,而Client和Server就是在不同的进程中的,具体过程如下:首先Server会到SM中注册一张表,它会告诉SM说有一个Object对象可以执行add操作,于是SM就建立好了一张表。这时Client向SM来查询有没有一个add方法,我们知道进程间通讯的数据都是在内核当中,所以在通讯的时候Binder驱动会做一些手脚,并不会向Client端返回真正Server的add方法的Object对象,因为是无法进行操作的,而是返回Object的一个代理对象,而代理对像中包含了一个add()方法,但是这个方法是一个空方法,它是包装好之后最终由内核去实现,当然这层实现逻辑对于Client是透明的,这就是分层协议的好处。而当Client调用这个代理对像的add()方法时,会交由Binder驱动处理,而它会去SM表中查到正好有一个add的Object对象,然后真正去调用Server端的add方法,调用完之后,又会把结果返回给Binder驱动,然后再返回给Client,也就是Binder就充当了一个中介的角色来实现进程间的通信。
    总结:也就是客户端进程只不过是持有的是服务端的代理,而代理对象携助驱动完成了跨进程。

  • 到底什么是Binder!!
    1、通常意义下,Binder指的是一种通信机制。
    2、对于Server进程来说,Binder指的是Binder本地对象/对于Client来说,Binder指的是Binder代理对象。
    3、对于传输过程而言,Binder是可以进行跨进程传递的对象。

AIDL:

  • 先声明一个aidl文件,然后编译会生成一个aidl.java文件,看下里面的具体内容: 

    所以说在Service中使用时得返回一个具体的类,如下:

    然后再回到生成的Aidl代码中:

    而对应使用代码而言就如下:

    继续再来看AIDL源代码:

    注意:

    上面是对外定义的方法的具体实现

    以上就是一个非常完整的Binder机制的整个流程。

Android基础相关面试问题-binder面试问题详解的更多相关文章

  1. linux基础之LSB定义的常用目录详解

    Linux基础之LSB定义的基本目录详解 1.LSB中FHS(Filesystem Hierarchy Standard)定义的一些文件 /boot:主要是存放引导文件的目录,比如内核文件(vmlin ...

  2. Android 调用图库选择图片实现和参数详解

    //选择图片,调用图库        bt4.setOnClickListener(new OnClickListener() { @Override            public void o ...

  3. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  4. Java基础-DButils工具类(QueryRunner)详解

    Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...

  5. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  6. 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)

    1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...

  7. java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问

    本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...

  8. 不止面试—jvm类加载面试题详解

    面试题 带着问题学习是最高效的,本次我们将尝试回答以下问题: 什么是类的加载? 哪些情况会触发类的加载? 讲一下JVM加载一个类的过程 什么时候会为变量分配内存? JVM的类加载机制是什么? 双亲委派 ...

  9. Android学习之基础知识二(build.gradle文件详解)

    一.详解build.gradle文件 1.Android Studio是采用Gradle来创建项目的,Gradle是非常先进的构建的项目的工具,基于Groovy领域特定的语言(DSL)来声明项目配置, ...

随机推荐

  1. 【Gym - 100923I】Por Costel and the Pairs(思维题)

    Por Costel and the Pairs Descriptions 有T组测试样例 有n个男的,n个女的,第i个人都有为当前一个大小为i的懒惰值,当一男一女懒惰值的乘积<=n他们就就可以 ...

  2. VAEs(变分自编码)之keras实践

    VAEs最早由“Diederik P. Kingma and Max Welling, “Auto-Encoding Variational Bayes, arXiv (2013)”和“Danilo ...

  3. el-tree点击获取直接父级的属性

    这里是可以一直往上获取它的直接父级的所有属性以及状态 通过这两个事件其中的一个 在方法里可以写上 methods:{ curCheck(data,state){ const curNode = thi ...

  4. golang break label 与goto label

    本文链接:https://blog.csdn.net/itbsl/article/details/73380537 与其他语言一样,Go语言也支持label(标签)语法:分别是break label和 ...

  5. 腾讯云CentOS 7搭建简单Tomcat+nginx集群

    1.安装Tomcat 进入 /usr/local/ 目录 cd /usr/local 下载 wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v ...

  6. airflow原理

    官网: http://airflow.apache.org/installation.html 原理: https://www.cnblogs.com/cord/p/9450910.html 原理介绍 ...

  7. [bzoj1135][Ceoi2011]Match_线段树

    [Ceoi2011]Match 题目大意:初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负, ...

  8. 小记--------spark的Master主备切换机制原理分析及源码分析

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABfEAAAJwCAYAAAAp7ysfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw

  9. springboot系列:使用缓存

    前言:springboot已经为我们实现了抽象的api接口,因此当我们使用不同的缓存时,只是配置有可能有点区别(比如ehcache和Redis),但是在程序中使用缓存的方法是一样的. 1.spring ...

  10. IE浏览器中判断IE版本

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![e ...