Binder的详细图解
2023-01-29 11:42:26 0 举报
android中binder不同层次的解读
作者其他创作
大纲/内容
句柄3
句柄2
IBinder/Binder
数据
命令代码
1. BinderProxy继承自IBinder,实际上就是一个句柄 ,发送事务2. Binder2a继承自Binder,只要是处理onTransact()方法3. 进程1和进程2都通过 Binder2a,Binder1b 来处理事务;BinderProxy来发送事务,达到两边相互通信的目的
事务
进程1
对象1b
8
BinderProxy(句柄3)
onTransact()
对象2a
内核
送到:对象1来自:进程1(数据)
送到:句柄2
进程2
Binder用户空间
T2
Parcel
6
送到:Binder2a来自:进程1
2
Binder1b
句柄1
1)进程1创建一个初始的食物结构,其中包含对象1b的本地地址2)进程1提交事物到内核3)内核查看事务中的数据,找到地址对象1b,并且创建一个针对它的新条目,因为以前并不知道该地址(进程1中的对象1b映射)4)内核利用事物的目标句柄2来确定它已在进程2中的对象2a5)内核现在将事物头重写,使其适合进程2,改变其目标为地址对象2a6)内核同样为目标进程重写事务数据;此处发现对象1b还不能被进程2识别,所以它创建一个新的句柄3,指向对象1b7)重写的事务被交付给进程2来执行8)一旦接收到事务,进程2会发现新的句柄3,并添加到句柄表中
线程池
内核标记来自哪里,同时映射找到对象1,具体怎么找到后边讲到
Ta
Binder内核模块(Binder Driver)
结果代码
BinderProxy(句柄2)
方法调用
T1
接口/AIDL
Binder用户空间API
送到:对象1(数据)
对象1a
Binder 跨进程对象映射
3)Parcel(包) 是一个容器,用于读写Binder事务中的数据。它拥有用于读和写类型化数据(整数、字符串、数组)的方法,但是更加重要的是它可以读和写对任何IBinder对象的引用,是用适当的数据结构供内核跨进程理解和传输改引用
1
在进程之间传输Binder对象流程
5
送到:对象2a来自:进程1
Binder IPC 体系结构
Binder2a
4
2)进程1提交事物到内核
平台应用程序
transact()
基本的Binder IPC 事务
送到:句柄2来自:进程1
接口定义
对象1
7
ioctl()
对象2b
3
1)IBinder是Binder对象的抽象接口。其关键方法是transact,它将一个事物提交给对象。接收事务的对象可能是本地进程,也可能是另一个进程的对象;如果是另一个进程对象,则会通过前边的Binder内核模块交付给它。
1. 句柄是按需分配的;2. 不用进程,句柄值相同并不意味着对应的相同
2)Binder是一个具体的Binder对象。实现一个Binder的子类将给你一个可以从其他进程调用的类。其关键方法是onTransact,它接收发送给它的一个事务。Binder子类的主要责任是查看它接收的事物数据,并执行适当的操作
0 条评论
下一页