Binder(三)简析

接下来以简单的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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容