进程间通信
Binder是IPC进程间通信的一种机制
1.png 2.png传统IPC
1通过copy_from_user 复制到内核空间
2再通过copy_to_user复制到另一个进程
复制了两次
Binder作用
3.pngBinder
1通过copy_from_user 复制到内核空间
2通过mmap映射,同时映射到同一块物理地址
复制了一次
安全性
为每个app分配UID
同时支持实名和匿名
源码分析
AIDL源码分析
5.pngaidl相当于快递小哥,Binder相当于站点。
代码举例
服务端
客户端
7.png 8.png 10.png 11.png1客户端如何获取aidl遥控器?
2通过这个遥控器是如何调到服务端的 ?
3服务端如何处理?
首先在客户端 connection对象里要拿到xxxAidl对象
xxxAidl = IxxxAidl.Stub.asInterface(service)
asInterface源码
12.png首先判断iin是否在同一个进程,否直接返回proxy服务端代理类
13.png使用时直接
xxxAidl .addPerson(...)
xxxAidl .getPersonList();
他是如何跑到服务端的呢?直接点击方法,进入Aidl.java (此方法在上图的Proxy里)
14.png首先进行数据打包,再去请求服务端
mRemote.transact(Stub.TRANSACTION_xxx,_data,_reply,0);
通过“mRemote.transact”请求Binder,
Binder经过处理(C/C++层)后调用onTransact()方法
进入服务端Stub 里
找到调用的哪个方法后,最后调用“this.xxx(...)”即会跑到实现类中调用。即服务端中的方法。
16.png流程图
17.pngproxy负责发送,stub负责接收
Binder源码分析
binderService如何绑定服务?
binderService(...)方法最终会跑到ContextImpl.java里
18.png往Common里走
19.png因为系统服务有很多,有个特殊的服务叫AMS类似中介
上图getDefault()返回了IActivityManager,拿到AMS服务.
IActivityManager extends IInterface
注:IActivityManager相当于ILeoAidl(ILeoAidl也是继承 IInterface)
往后AMS.binservice(...)类似AIDL,会跑到Proxy里
20.pngbinservice实际上调用了Proxy里的binservice
21.png 22.pngmRemote.transact(...)和Aidl一模一样
看流程图 transact()后 会调用Stub中的方法,这里的Stub是ActivityManagerNative,里面有onTransact()方法
23.pngActivityManagerService 继承自ActivityManagerNative
相当于
Service 继承自Stub
调用到里面的binderService
24.png往里走
25.png往下
26.png如上图 创建了服务
27.png 28.pngr.app.thread.scheduleBinderService是ActivityThread。java里的
29.png调用Handler的sendMessage(H.BIND_SERVICE,s)
30.png获取住的服务后,之前没绑定调用onBind;之前绑定了,调用onreBind。
没绑定然后跑回AMS里的publishServerce()方法
进入ActivityService
32.png 33.pngc.conn.connected就会调用到客户端的onServiceConnected()