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. python-Web-django-商城-购物车商品加减

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Java垃圾收集算法1

    Java垃圾收集算法 由于垃圾收集算法的实现涉及大量的程序细节,而且每个平台的虚拟机操作内存的方法又各不相同,因此博客中不过多的讨论算法的实现,只是介绍几种算法的思想以及发展. 相关阅读: 1.深入理 ...

  3. flask内置的信号

    from flask import Flask,request,template_rendered,render_template,got_request_exception from signals ...

  4. 贪心学院 scrapy爬虫

    生成爬虫 scrapy genspider 爬虫名 网址 打开调试用shell scrapy shell 网址 主体 stock.py # -*- coding: utf-8 -*- import r ...

  5. Wordpress 所有 hook 钩子

    muplugins_loaded 在必须使用的插件加载之后. registered_taxonomy 对于类别,post_tag 等 Registered_post_type 用于帖子,页面等 plu ...

  6. Spring学习笔记(一)

    Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...

  7. 百度地图的初始化应当在vue的mounted()函数里执行

    今天使用百度地图出现了一个问题,百度地图初始化后宽.高都是0,但是地图容器宽高都设置好的, 一开始怎么都排除不出问题,后来无语了,把布局直接复制进入百度地图的示例里运行发现没有问题, 所以想到不是百度 ...

  8. mysql45讲

    一共48讲,学习时间2天. 开篇词 (1讲) 开篇词 | 这一次,让我们一起来搞懂MySQL 理论指导实践:先系统性的学习原理,再实践验证. 你可以从点到线再到面,形成自己到mysql知识网络. 在使 ...

  9. 移动端真机debug调试神器 vConsole学习(二)之实战

    项目中实际使用 在项目中实际使用的时候发现还是有很多问题的 最初使用方式  <script src="vconsole.min.js"></script> ...

  10. arcgisJs之featureLayer中feature的获取

    arcgisJs之featureLayer中feature的获取 在featureLayer中source可以获取到一个Graphic数组,但是这个数组属于原数据数组.当使用 applyEdits修改 ...