Binder和AIDL

学习笔记,仅供自己参考,如有不对欢迎指正

1.binder机制

binder.png

1.用户空间和内核空间:在linux中,进程空间分为用户空间内核空间用户空间不可以进行数据交互;内核空间可以进行数据交互,所有进程共用一个内核空间。
2.Binder进程间通信机制相遇与linux传统方式好处:
(1)性能更好;Binder机制只需要拷贝数据一次,管道、消息队列、Socket等都需要拷贝数据两次;而共享内存虽然不需要拷贝,但实现复杂度高。
(2)安全性更高;采用唯一的uid,当安装一个应用app时;系统会为其分配一个uid;一块内存空间;因此进程uid是鉴定进程身份重要标志。
3.Binder跨进程通信机制组成元素:基于C/S架构,由Client、Server、Server Manager和Binder驱动组成。
4.Binder驱动实现的原理:通过内存映射,即系统调用了mmap()函数,核心类是MappedByteBuffer

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

5.Server Manager的作用:管理Service的注册和查询。
6.Binder驱动的作用:
(1)传递进程间的数据,通过系统调用mmap()函数;
(2)实现线程的控制,通过Binder驱动的线程池,并由Binder驱动自身进行管理。
7.Binder驱动的线程池:Server进程会创建很多线程处理Binder请求,这些线程采用Binder驱动的线程池,由Binder驱动自身进行管理。一个进程的Binder线程池默认最大是15个,超过的请求会阻塞等待空闲的线程。
8.Binder机制中的四个组件Client、Server、Service Manager和Binder驱动 的关系:
(1)Client、Server、Service Manager三者存在用户空间中和Binder驱动在内核空间中
(2)Service Manager和Binder驱动android底层已经实现,我们只需要在用户空间实现Client、Server
(3)Client和Server之间的通欣,是通过Binder驱动间接实现的
9.Android Input子系统为什么使用Socket,而不是Binder
(1)Input系统事件分发是双向通信。Binder不适合做双向通信
(2)Input系统中的事件本身数据量比较小,Binder只需要Copy一次数据的优势变得不明显
(3)Binder是CS架构,用于系统service之间或者APP作为service作为Client调用Sevice(如AMS)。整体类似http,Input系统的通信机制与之不同,需要双向通信,由Service通知Client

2.关于AIDL

(1)AIDL支持的数据类型

  • 基本数据类型(int、long、char、boolean、double等);
  • String和CharSequence;
  • List:只支持ArrayList,而且里面的每个元素也必须是AIDL所支持的类型;
  • Map:只支持HashMap,而且里面的每个key和value都必须是AIDL所支持的类型;
  • Parcelable:所有实现了Parcelable接口的对象;
  • AIDL:所有的AIDL接口自身也可以在AIDL中使用;
    (2)AIDL具体使用:
    步骤1:Book.java类,需要实现Parcelable接口(为了被AIDL所支持)
    image.png

    步骤2:Book.aidl文件,需要声明一下:
    image.png

    步骤3:IBookManager.aidl文件:
    image.png

    步骤4:编译服务端代码会生成一个IBookManager.java
    image.png

    步骤5:编写远程服务代码RemoteService:
    image.png

    步骤6:客户端是实现就是将服务端的整个目录全部复制到本地,包名不能变。
    步骤7:在Client的MainActivity中绑定远程服务,并调用远程服务中的方法实现功能:
    图片7.png

    image.png

你可能感兴趣的:(Binder和AIDL)