接下来以简单的ITest.aidl为例,介绍Binder的调用结构
1.ITest.aidl的源码如下
图12. AS下编译ITest.aidl,生成ITest.java
图2-1 图2-2 图2-3 图2-4 图2-5 图2-63. 接下来是服务端开发
图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
网友评论