Android每天一个知识点+Demo—跨进程通信机制AIDL入门

一 Why-为什么要用AIDL

沙箱理念:在Android中,每个应用(Application)程序都运行在独立的进程中,无法直接调用到其他应用的资源。当一个应用被执行时,一些操作是被限制的,比如访问内存,访问传感器等等。

好处:这也保证了当其中一个程序出现异常而不会影响另一个应用程序的正常运转,这样做可以最大化地保护系统。 android在设计理念上强调组件化,组件之间的依赖性很小

案例:我们往往发一个intent请求,就可以启动另一个应用的activity;

          可以启动一个你不知道在哪个进程的service;

          可以注册发送一个广播;

          可以查询一个contentProvider获得你想要的数据。

          这其实都需要跨进程通信的支持。

二 What-AIDL到底是什么

1 AIDL到底是什么

问题:在Android平台,一个进程通常不能访问另一个进程的内存空间为了使其他的应用程序也可以访问本应用程序提供的服务。

解决:Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。

          与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。

          可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。

原理:Android提供了AIDL工具,可以将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界,而通过代码来实现这个数据传输过程是冗长乏味的。

                                                                              

       最底层的是android的ashmen(Anonymous shared memoryy)机制,它负责辅助实现内存的分配,以及跨进程所需要的内存共享。

      AIDL(android interface definition language)对Binder的使用进行了封装,可以让开发者方便的进行方法的远程调用。

      Intent是最高一层的抽象,方便开发者进行常用的跨进程调用。

2 Binder到底是什么

Binder简介:binder属于一个驱动,工作在linux层面,运行在内核态,它的操作完成是基于一段内存。

Binder组成:Binder架构由服务端,binder驱动,客户端三个部分构成。其中服务端,客户端处在用户空间,而binder驱动处在内核空间。

                                                         

服务器端:一个Binder服务器端就是一个Binder类的对象。当创建一个Binder对象后,内部就会开启一个线程,这个线程用于接收binder驱动发送的信息,收到消息后,会执行相关的服务代码。

Binder驱动:当服务端成功创建一个Binder对象后,Binder驱动也会相应创建一个mRemote对象,该对象的类型也是Binder类。客户就可以借助这个mRemote对象来访问远程服务。

客户端:客户端要想访问Binder的远程服务,就必须获取远程服务的Binder对象在binder驱动层对应的mRemote引用。当获取到mRemote对象的引用后,就可以调用相应Binder对象的服务了。

2 Binder相关总结

Binder总结:我们可以看到,客户端是通过Binder驱动来调用服务端的相关服务。

                      首先,在服务端创建一个Binder对象,然后相应在Binder驱动中创建一个Binder对象。

                      接着,客户端通过获取Binder驱动中Binder对象的引用来调用服务端的服务。

                     在Binder机制中正是借着Binder驱动将不同进程间的组件bind(粘连)在一起,实现通信。

                     对Binder而言,Binder可以看成Server提供的实现某个特定服务的访问接入点, Client通过这个‘地址’向Server发送请求来使用该服务; 对Client而言,Binder可以看成是通向Server的管道入口,要想和某个Server通信首先必须建立这个管道并获得管道入口。

使用效果:我们看不到binder,我们感觉就像是客户端直接请求服务端请求,然后通过服务端的一个代理对象处理相关工作。Activity与service之间仿佛是一种很直接的,自然的通信。

三 How-AIDL如何实现

我们以WiFi中WifiManager为例

Settings主要类:

                      

使用AIDL流程:

         1. 根据IWifiManager接口所创建的Binder服务器端和客户端,服务器端是WifiService,客户端是WifiManager。

         2. IWifiManager.aidl

         3. IWifiManager.aidl编译后生成IWifiManager.java,并生成IWifiManager.Stub(服务器端抽象层)和IWifiManager.Stub.Proxy(客户端代理实现类)。

        4. WifiService通过继承IWifiManager.Stub实现;而客户端通过getService函数获取IWifiManager.Stub.Proxy,即Service的代理类,将其作为参数传递给WifiManager,供其与WifiService通信时使用。

         5. WifiManager是WiFi部分与外界关联的接口,用户通过它来访问WiFi的核心功能。WifiService是服务器端的实现,作为WiFi部分的核心,处理实际的驱动加载、扫描、连接、断开等命令,以及底层上报的事件。

猜你喜欢

转载自blog.csdn.net/weixin_42093428/article/details/82711706