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. centos 自动挂载ISO

    创建挂载点并挂载光盘mkdir -p /media/cdrommount -t iso9660 -o loop /usr/ison/centos.iso /media/cdrom 设置开机自动挂载:方 ...

  2. 《九阴真经:iOS黑客攻防秘籍》新书发布

    本书内容易于理解,可以让读者循序渐进.系统性地学习iOS安全技术.书中首先细致地介绍了越狱环境的开发与逆向相关工具,然后依次讲解了汇编基础.动态调试.静态分析.注入与hook.文件格式,最后为大家呈现 ...

  3. JAVA实验报告四及第六周总结

    JAVA第六周作业 实验报告四 第一题 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造 ...

  4. [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca

    [Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...

  5. SQL 拼接字符串 使用IN查询方法

    问题描述 当在 SQL SERVER 中查询的时候,同事遇到一个字段存储的字符串为用逗号分隔的主键 ID 值,格式为:1,2,3,4,这时候需要查询符合条件的所有数据,所以选择使用 IN 查询,但是直 ...

  6. vm下centos7 mini版 NAT模式下配置静态IP

    1.查看虚拟机的默认网关和子网掩码 a.vm菜单栏点击编辑->虚拟网络编辑器 b.选择VMnet8,点击NAT设置,查看子网掩码.网关IP                2. 修改服务器的网络配 ...

  7. 【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例

    类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”, ...

  8. C++结构体、类和对象

    在C++中结构体(struct)和类(class)可以通用,[结构体是一种特殊的类] struct和class的区别:访问和控制. struct在缺省值的情况下可以是public在外部被访问到对于类来 ...

  9. h5中的分组元素figure、figcaption、hgroup元素介绍

    分组元素用于对页面中的内容进行分组. figure元素和figcaption元素 figure元素用于定义独立的流内容(图像.图表.照片.代码等),一般指一个独立的单元.figure元素的内容应该与主 ...

  10. 电脑主板插线方法图解_JFP1主板插线图解

    电脑主板插线方法图解_JFP1主板插线图 仔细看主板上有对应的英文标识的,一对一插就行分别是电源,复位,硬盘灯,电源灯的负极,正极