欢迎光临散文网 会员登陆 & 注册

Android 理解Binder机制(二)解读AIDL对应的Java文件

2022-02-13 14:01 作者:房顶上的铝皮水塔  | 我要投稿

本文会结合上一篇文章:AIDL+Service的简单使用进行对于Android SDK生成的Java文件解读。

这些类的关系如下图所示,在总结部分还会重新整理:

IBookManager类的结构描述

IBookMananger最开始使我们定义在AIDL文件中的一个接口,他会通过Android SDK工具生成对应的Java文件。    其中包括了这样的一些关键的方法和内部类。

Default类

default类在默认生成中什么也没有干:

方法基本上都是空实现。真正的进行业务相关的处理的类在Stub类中,这个类也是我们在Service中需要继承并且实现我们的业务逻辑。

IBookManager.Stub


上述代码中有一些需要说明的地方:

  1. asInterface:从注释中可以知道,将IBinder转换成对应的【接口】是区分进程的。如果需要跨进程通信,就会调用Stub的内部类,也就是Proxy的方法。

对于是本地Service还是remote service,实现的区别略有不同,总结在下图中:

remote Service就不再赘述了。如果是本地Service,我们还是需要实现一个Binder,并且通过Service#onBind进行返回。然后在ServiceConnection中,强制类型转换就可以获取我们的定义的LocalBinder,然后调用我们的业务逻辑。

2. onTransact:onTransact的回调主要发生在跨进程通信中。

举我们的客户端请求的代码为例:

这里调用Manager.getBookList()的实现就是通过Stub.Proxy中的同名方法实现的:

在这个个方法中,后面会调用Binder#transact。大家应该还记得在服务端中的Service中,我们实现了一个类,继承自IBookManager.Stub,同时这个Stub也是一个Binder,并且通过Service#onBind返回。这个Remote就是那个实现类。

在Binder#transact中,后面会回调onTransact方法:

它的思路是这样子:

客户端调用IBookManager#getBookList -> IBookManager.Stub.Proxy#getBookList -> IBinder#transact -> IBookManager.Stub.onTransact 解析具体的方法。

下面我们具体看看IBookManager.Stub.onTransact:

这个方法对于我们定义咋interface中的方法通过switch-case进行处理,比如说getBookList方法,在调用getBookList进行返回。不过this.getBookList的实现还是在我们的业务实现类中。取出结果之后,在通过parcel封装并返回。

总结

最后总结一下:

  1. IBookManager.aidl 会通过Android SDK工具生成对应名称的Java文件,这个Java文件中封装的业务逻辑和核心类是Stub

  2. Stub会首先判断当前的接口调用是否需要跨进程,如果不需要跨进程,可以直接访问方法;如果需要跨进程就会通过Proxy方法调用。

  3. 在proxy中主要是进行一个Parcel的解包和打包的工作,然后会调用Binder的transact方法,最后回调Binder#onTransact方法,这个方法运行在Binder的线程池中。不需要再业务逻辑中进行开启子线程的操作;但是在客户端中,客户端发起远程请求时,客户端线程会被挂起,这里最好别写在UI线程。


Android 理解Binder机制(二)解读AIDL对应的Java文件的评论 (共 条)

分享到微博请遵守国家法律