AIDL原理

六月ゝ 毕业季﹏ 提交于 2020-01-16 03:42:41

一、简介

AIDL是Binder的延伸,很多Android系统服务都是AIDL(如剪切板)

二、AIDL涉及的几个类

  • IBinder
  • IInterface
  • Binder
  • Proxy
  • Stub

当自定义一个aidl文件时(如MyAidl.aidl,里面有一个sum方法),AS会为我们生成一个MyAidl.java的类文件。这个类文件由1个接口(IInterface)和2个类(Stub、Proxy)组成,之所以不是分开生成3个文件,是因为当AIDL类多的时候,Stub和Proxy就会重名冲突,将其放在各自的AIDL文件中就能避免这种情况。

三、sum方法的调用

Stub中的sum是如何调用Proxy中的sum?又是如何调用另一个进程的sum方法的?关键就在于Stub中的asInterface方法和onTransact方法!

3.1 Client角度

站在Client的角度,应该

MyAidl.Stub.asInterface(某IBinder对象).sum(12)

asInterface方法的作用就是判断参数(即IBinder对象)和自己是否在同一个进程中。

  • 是,直接转换、直接使用,以后的事情和Binder跨进程通信无关
  • 否,就把这个IBinder对象包装为一个Proxy对象。此时调用Stub的sum方法,就是调用的Proxy的sum方法(return new MyAidl.Stub.Proxy(obj);)

3.2 Proxy的作用

在Proxy自己的sum方法中,会使用Parcelable来准备数据:

  • ① 把函数名称、函数参数都写入到_data中
  • ② 让_reply接收函数返回值
  • ③ 使用IBinder的transact方法,将数据传递给Binder的Server端
//这个mRemote就是asInterface方法传来的obj参数
mRemote.transact(Stub.TRANSACTION_addBook,_data,_reply,0);

3.3 Server角度

Server通过onTransact方法接收来自Client的数据(包括函数名称、函数参数),找到对应的函数(这里指的sum方法),把参数传进去,return结果。onTransact函数经历了:

“读数据”--->执行要调用的函数--->将结果再“写数据”
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!