Android AIDL
2020-06-19 本文已影响0人
InFatuated
AIDL原理是什么?如何优化多模块都使用AIDL的情况?
AIDL(Android Interface Definition Language Android定义接口语言 ):如果在一个进程中要调用另一个进程对象的方法,可使用AIDL生成可序列化参数,AIDL会生成一个服务端的对象的代理类,通过它,客户端实现间接调用服务端对象的方法。
AIDL本质是系统提供了一套可快速实现Binder的工具,关键类和方法:
- AIDL接口:继承Interface。
- Stub类:Binder的实现类,服务端通过这个类来提供服务。
- Poxy类:服务器的本地代理,客户端通过这个类调用服务端的方法。
- asInterface():客户端调用,将服务器返回的Binder对象,转换成客户端需要的AIDL接口类型对象。如果客户端和服务端位于同一进程,直接返回stub对象本身,否则返回系统封装后的Stub.poxy对象。
- asBinder():根据当前的调用情况,返回代理Poxy的Binder对象。
- onTransact():运行在远程服务端的线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法来处理。
- transact():运行在客户端,当客户端发起远程请求的同时,将当前线程挂起,之后调用服务端的onTtransact()方法,知道远程请求返回,当前线程才继续执行。
当有多个业务模块都需要AIDL来进行IPC时,需要为每个模块创建特定的aidl文件,那么相应的service就会很多。必然会出现系统资源消耗严重,应用过度的重量级的问题。解决方法就是建立Binder连接池,即将每个业务的Binder请求统一转发到远程Service中去执行,从而避免重复的Service。
- 工作原理:每个业务模块创建自己的AIDL接口并实现接口,然后想服务端提供唯一标识会对应的Binder对象。服务端只需要一个Service,服务器提供一个queryBinder接口,它会根据业务模块的特征来返回相应的Binder对象,不同业务模块那倒所需的Binder对象后,就可以进行远程方法的调用了。