换个角度理解Android的AIDL原理

1,045 阅读2分钟

本文行思路

本篇文章笔者谈论的是android使用AIDL进行进程间通信原理,但本文不打算一上来就介绍如何使用AIDL,本文会先假设Android没有提供AIDL我们应该如何“用自己的方式”实现IPC,介绍完这一点之后,本文再对比AIDL这种方式实现IPC,并尝试理解AIDL背后代码之间的关系。下文图片是本文“用自己的方式”实现IPC的案例交互图,如下:

LibraryServer跨进程提供图书查询服务流程图.png
LibraryServer跨进程提供图书查询服务流程图.png

图片解释

蓝色部分的LibraryServer和Client是本文案例中两个不同的APP,其中LibraryServer能够提供左边绿色部分的“BookCheckService”服务(包含getBookInfo、getBookList),为了能够拥有提供远程服务的能力LibraryServer同时还“招聘”了Binder这种具有远程交互能力的对象,于是LibraryServer通过“BookCheckService”+"Binder"这对组合就拥有提供远程服务的能力了。而Client也是“招聘”了Binder,企图通过Binder来使用远程服务。“黄色部分”又是什么意思呢?其实这只是笔者对Binder机制在底层通信进行的极简的描述,实际上Binder机制在底层通信十分复杂,笔者打算放在其它篇章讨论;“黄色”部分简单地解释了远程服务LibraryServer其实是将它自己的Binder的句柄注册在内核,Client实际上拿到的只是LibraryServer的Binder的句柄,通过内核的Binder映射,再与远程服务交互。

Demo 关键代码分析

image.png
image.png

上文是Client APP运行后的显示效果,功能很简单,下面对主要代码进行说明:

Client端代码

image.png
image.png

image.png
image.png

下面这个函数是请求“查询图书信息”远程服务的实现逻辑

image.png
image.png

同样请求“获取图书列表”远程服务的实现逻辑如下:

image.png
image.png

远程端LibraryServer 代码

image.png
image.png

image.png
image.png

image.png
image.png

##测试结果

image.png
image.png

AIDL实现IPC

上文提到的是使用“自己的方式”实现IPC,下文介绍在这个案例中是如何使用AIDL通信的,关于如何在AndroidStudio创建AIDL文件,这里笔者不再细说,不清楚的朋友可以参考这篇文章:www.jianshu.com/p/d1fac6cce…

image.png
image.png

image.png
image.png

image.png
image.png

上图是笔者使用AIDL自动成的BooKCheckService.java文件,可以用下面的UML来描述各个类之间的联系,如下:

image.png
image.png

我们先来看以下关键代码:

image.png
image.png

再来看看Proxy类中的细节,如下:

image.png
image.png

到此可以看到AIDL实现IPC与上文我们以“以自己的方式”实现IPC本质是一样的,只是AIDL语言会为我们自动生成相关的类,简化我们的编码工作。

案例源码

github.com/ZhongXiaoHo…