Binder是IPC进程间通信的一种机制
![](https://img.haomeiwen.com/i14355128/a33d6288699b852f.png)
![](https://img.haomeiwen.com/i14355128/2507c1275087dbb0.png)
传统IPC
1通过copy_from_user 复制到内核空间
2再通过copy_to_user复制到另一个进程
复制了两次
Binder作用
![](https://img.haomeiwen.com/i14355128/34b46eaf94658275.png)
Binder
1通过copy_from_user 复制到内核空间
2通过mmap映射,同时映射到同一块物理地址
复制了一次
![](https://img.haomeiwen.com/i14355128/ff5257295c29bb14.png)
安全性
为每个app分配UID
同时支持实名和匿名
源码分析
AIDL源码分析
![](https://img.haomeiwen.com/i14355128/35caef90e7bae088.png)
aidl相当于快递小哥,Binder相当于站点。
代码举例
服务端
![](https://img.haomeiwen.com/i14355128/461cec34a0bd74c1.png)
![](https://img.haomeiwen.com/i14355128/7903bf9f7d7f6885.png)
客户端
![](https://img.haomeiwen.com/i14355128/331231de58c7a6ea.png)
![](https://img.haomeiwen.com/i14355128/c0c98fd33c84ba93.png)
![](https://img.haomeiwen.com/i14355128/fef0f9bb7fc42c8a.png)
![](https://img.haomeiwen.com/i14355128/433508e1e9fc8e0c.png)
1客户端如何获取aidl遥控器?
2通过这个遥控器是如何调到服务端的 ?
3服务端如何处理?
首先在客户端 connection对象里要拿到xxxAidl对象
xxxAidl = IxxxAidl.Stub.asInterface(service)
asInterface源码
![](https://img.haomeiwen.com/i14355128/dd522e66ab0b6f51.png)
首先判断iin是否在同一个进程,否直接返回proxy服务端代理类
![](https://img.haomeiwen.com/i14355128/2ba0d94bac2b5ae0.png)
使用时直接
xxxAidl .addPerson(...)
xxxAidl .getPersonList();
他是如何跑到服务端的呢?直接点击方法,进入Aidl.java (此方法在上图的Proxy里)
![](https://img.haomeiwen.com/i14355128/c92d65057ee5ce04.png)
首先进行数据打包,再去请求服务端
mRemote.transact(Stub.TRANSACTION_xxx,_data,_reply,0);
通过“mRemote.transact”请求Binder,
Binder经过处理(C/C++层)后调用onTransact()方法
进入服务端Stub 里
![](https://img.haomeiwen.com/i14355128/ecf67730bb2304a0.png)
找到调用的哪个方法后,最后调用“this.xxx(...)”即会跑到实现类中调用。即服务端中的方法。
![](https://img.haomeiwen.com/i14355128/34daed6a4ba3c643.png)
流程图
![](https://img.haomeiwen.com/i14355128/52e3e64e4d7afd98.png)
proxy负责发送,stub负责接收
Binder源码分析
binderService如何绑定服务?
binderService(...)方法最终会跑到ContextImpl.java里
![](https://img.haomeiwen.com/i14355128/307b4d6810e9ad18.png)
往Common里走
![](https://img.haomeiwen.com/i14355128/33ffd942836e60a6.png)
因为系统服务有很多,有个特殊的服务叫AMS类似中介
上图getDefault()返回了IActivityManager,拿到AMS服务.
IActivityManager extends IInterface
注:IActivityManager相当于ILeoAidl(ILeoAidl也是继承 IInterface)
往后AMS.binservice(...)类似AIDL,会跑到Proxy里
![](https://img.haomeiwen.com/i14355128/2bd4df01ebc024dd.png)
binservice实际上调用了Proxy里的binservice
![](https://img.haomeiwen.com/i14355128/6e7251a578dd746c.png)
![](https://img.haomeiwen.com/i14355128/a2454ce4f2fa2045.png)
mRemote.transact(...)和Aidl一模一样
看流程图 transact()后 会调用Stub中的方法,这里的Stub是ActivityManagerNative,里面有onTransact()方法
![](https://img.haomeiwen.com/i14355128/1c1ee1364fc8e4b2.png)
ActivityManagerService 继承自ActivityManagerNative
相当于
Service 继承自Stub
调用到里面的binderService
![](https://img.haomeiwen.com/i14355128/b7b51335f4ba7883.png)
往里走
![](https://img.haomeiwen.com/i14355128/b8fc79082002b32e.png)
往下
![](https://img.haomeiwen.com/i14355128/a69b2941a30fb70a.png)
如上图 创建了服务
![](https://img.haomeiwen.com/i14355128/de64bc9716572253.png)
![](https://img.haomeiwen.com/i14355128/da34e03cefe53c0a.png)
r.app.thread.scheduleBinderService是ActivityThread。java里的
![](https://img.haomeiwen.com/i14355128/5468c9450d98d11e.png)
调用Handler的sendMessage(H.BIND_SERVICE,s)
![](https://img.haomeiwen.com/i14355128/a3814d04e35134a3.png)
获取住的服务后,之前没绑定调用onBind;之前绑定了,调用onreBind。
没绑定然后跑回AMS里的publishServerce()方法
![](https://img.haomeiwen.com/i14355128/88469e0e51f18b6c.png)
进入ActivityService
![](https://img.haomeiwen.com/i14355128/fa7c28da5dc9b8d1.png)
![](https://img.haomeiwen.com/i14355128/620d52da55eca8dc.png)
c.conn.connected就会调用到客户端的onServiceConnected()
网友评论