本文思路
本篇文章笔者谈论的是android使用AIDL进行进程间通信原理,但本文不打算一上来就介绍如何使用AIDL,本文会先假设Android没有提供AIDL我们应该如何“用自己的方式”实现IPC,介绍完这一点之后,本文再对比AIDL这种方式实现IPC,并尝试理解AIDL背后代码之间的关系。下文图片是本文“用自己的方式”实现IPC的案例交互图,如下:
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
上文是Client APP运行后的显示效果,功能很简单,下面对主要代码进行说明:
Client端代码
image.png
image.png
下面这个函数是请求“查询图书信息”远程服务的实现逻辑
image.png
同样请求“获取图书列表”远程服务的实现逻辑如下:
image.png
远程端LibraryServer 代码
image.png
image.png
image.png
测试结果
image.png
AIDL实现IPC
上文提到的是使用“自己的方式”实现IPC,下文介绍在这个案例中是如何使用AIDL通信的,关于如何在AndroidStudio创建AIDL文件,这里笔者不再细说,不清楚的朋友可以参考这篇文章:http://www.jianshu.com/p/d1fac6ccee98,下图为使用AIDL自动生成的代码,如下:
image.png
image.png
image.png
上图是笔者使用AIDL自动成的BooKCheckService.java文件,可以用下面的UML来描述各个类之间的联系,如下:
image.png
我们先来看以下关键代码:
image.png
再来看看Proxy类中的细节,如下:
image.png
到此可以看到AIDL实现IPC与上文我们以“以自己的方式”实现IPC本质是一样的,只是AIDL语言会为我们自动生成相关的类,简化我们的编码工作。
案例源码
https://github.com/ZhongXiaoHong/AIDLExample
作者:钟离四郎
链接:https://www.jianshu.com/p/5de1718454f8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
喜欢 就关注吧,欢迎投稿!
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/换个角度理解android的aidl原理/