Binder(三)简析

2021-09-02  本文已影响0人  tzlf

接下来以简单的ITest.aidl为例,介绍Binder的调用结构

1.ITest.aidl的源码如下

图1

2. AS下编译ITest.aidl,生成ITest.java

图2-1 图2-2 图2-3 图2-4 图2-5 图2-6

3. 接下来是服务端开发

图3-1

这里简单起见只是打印log

4. 实际调用

简单起见,使用ServiceManager注册服务,忽略selinux相关权限

a)服务端注册服务:

ServiceManager.addService("test",new TestImp());

b)客户端获取服务

IBinder   b = ServiceManager.getService("test");

ITest test = ITest .Stub.asInterface(b);

test .test(1,2);

注意上面图2-3 里的asInterface方法

图4

如果客户端和服务端处于同一进程,那么就是直接强转为(com.test.ITest),否则用com.test.ITest.Stub.Proxy包装,其中ServiceManager.getService("test")返回的是BinderProxy,BinderProxy是在JNI里生成

5.Binder调用流程

图5

在test方法中,将接口名,参数打包,调用mRemote.transact

mRemote其实就是BinderProxy。

而在服务端的onTransact,解析客户端传过来的参数,调用对应的test方法(TestImp继承实现)

整个流程分为:

1. 客户端test .test(1,2);

2.客户端test方法打包参数

3.mRemote.transact

4.内核传递数据

5.服务端binder.onTransact

6.服务端解析参数

7.TestImp.test(int a, long b)

其中3-5之间可以划分为传输层层,只用于Binder传递数据

而其他步骤都可归为业务层,如客户端打包参数,服务端解析参数,调用对应函数test

上一篇下一篇

猜你喜欢

热点阅读