从AIDL调用看Binder使用方法
前言:
最近在看VirtualApk的源码,发现里面很多涉及到代理模式
Binder调用本身就是使用一个超级复杂的代理模式
而我们接触到最多的Binder调用就是AIDL
因此这里分析一下AIDL的调用原理
Tips:此文章不讲述Binder底层的原理,只是通过AIDL调用的分析,来借花献佛
AIDL
Android Interface Definition Language
Android 接口定义语言
是android提供的一种本地调用远程服务接口的方式
先来看一下如何使用AIDL
首先定义AIDL接口
|
编译一下
服务端代码编写
|
客户端编写
|
看上去很简单,AIDL对内部的一些处理做了封装,那么要了解AIDL运作的整个过程,我们不妨看一下AS根据AIDL文件生成的java源码
这个java源码就在generatedJava文件夹下
如图所示
生成的源码格式化后如下
|
这一个个内部类继承又嵌套的看上去好难受,先不说google为啥这么写,拆分开再说
generatedJava中Stub继承自Binder 又实现了IAidlInterface接口,为了分离Stub和IAidlInterface 我们将其拆开,并在Stub初始化的时候传入一个实现了addition方法的IAidlInterface对象
asInterface()因为是一个静态公共方法,其实可以看成是一个工具方法,我们将其放在独立的Utils类下
因此我们将其拆分成4个类
1:AidlInterfaceBinderStub.java
下面请看源码注释
|
2 : AidlInterfaceProxy.java
|
3 : AidlInterfaceUtils.java
|
4 : IAidlInterface.java
|
以上四个类就是全部AIDL的逻辑流程,是不是发现其实以后不需要写AIDL文件,只要实现以上四个类就可以完成一个自定义的binder远程调用了。
下面再画个图总结下
AIDL调用
在各方面都体现着代理模式的思想,了解并清楚了这个流程,对分析系统AMS有很大的帮助
上述内容有一部分来自于其他大神的文章摘抄,本用于自己学习记录所用,由于之前写的比较仓促没有记下网址,此处先表示感谢,如有朋友看到类似的的文段,实属必然,后面我会做好记录。
附code
https://download.****.net/download/binghelonglong123/11013011