美文网首页AndroidAndroid开发经验谈Android开发
换个角度理解Android的AIDL原理

换个角度理解Android的AIDL原理

作者: 钟离四郎 | 来源:发表于2017-10-22 20:18 被阅读740次

    本文思路

    本篇文章笔者谈论的是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

    相关文章

      网友评论

        本文标题:换个角度理解Android的AIDL原理

        本文链接:https://www.haomeiwen.com/subject/skpcuxtx.html