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. Day04:异常处理(二) / 多线程基础

    多线程 线程是什么? 一个线程是线程一个顺序执行流. 同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的栈堆.线程在切换时负荷小,因此,线程也被称为轻负荷进程.一个进程中可以包 ...

  2. C++返回对象和返回引用

    我们发现,在C++中,有些成员函数返回的是对象,而有些函数返回的又是引用. 返回对象和返回引用的最主要的区别就是函数原型和函数头. Car run(const Car &)     //返回对 ...

  3. Quickcocos从安装到打包

    Quick-Cocos2dx-Community 是跨平台的游戏引擎,支持时下流行的 Android 移动操作系统.本节将教大家如何在 Windows 上把已经开发好的游戏打包为 Android 上可 ...

  4. 【并行计算-CUDA开发】CUDA shared memory bank 冲突

    CUDA SHARED MEMORY shared memory在之前的博文有些介绍,这部分会专门讲解其内容.在global Memory部分,数据对齐和连续是很重要的话题,当使用L1的时候,对齐问题 ...

  5. C学习笔记-数据类型

    常量 在程序中不可变化的量,也就不可赋值 常用两种定义方式,#define和const 另外还有一个字符串常量 define #define MAX 100 #define在预编译的时候,其实也是做的 ...

  6. Spring Boot + Vue 跨域请求问题

    使用Spring Boot + Vue 做前后端分离项目搭建,实现登录时,出现跨域请求 Access to XMLHttpRequest at 'http://localhost/open/login ...

  7. GitHub 将源代码保存在北极洞穴,至少使用 1000 年!

    最近,GitHub分享了开放Arctic Code Vault的计划,该计划旨在存储和保存Flutter和TensorFlow等开源软件. 所有开放源代码项目的代码都将存储在胶片上,该胶片每帧包含88 ...

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

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

  9. 【数位DP】恨7不成妻

    [数位DP]恨7不成妻 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 4[提交] [状态] [命题人:admin] 题目描述 单身!依然单身! 吉哥依然单身!DS级码农吉哥依 ...

  10. Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_PRC_CI_AI" in the equal to operation.

    Executed as user: NT AUTHORITY\SYSTEM. Cannot resolve the collation conflict between "Chinese_P ...