Binder相关问题
- 1、Binder是什么?
- 2、Binder有什么优势?
- 3、Binder如何做到一次拷贝的?
- 4、MMAP的原理是什么?
- 5、Binder机制是如何跨进程的?
- 6、为什么Intent不能传递大数据
- 7、AIDL生成Java类细节
- 8、四大组件底层的通信机制
1、Binder是什么?
Binder 是一种
IPC
进程间通信机制;一种misc device
虚拟字符设备驱动
2、Binder有什么优势?
Binder 共享内存 Soket 性能 拷贝一次 无需拷贝 拷贝两次 特点 C/S架构,易于使用 控制复杂 C/S架构,其传输效率低 安全性 每个APP分配UID,同时支持实名和匿名 依赖上层协议,访问时开放的不安全 依赖上层协议,访问时开放的不安全
3、Binder如何做到一次拷贝的?
Binder 发送端和接受端共享一块内存;使用
mmap
实现,将同一块物理内存分别映射到内核虚拟地址空间
和用户虚拟内存空间
,从而实现了用户空间的Buffer和内核空间的Buffer同步操作的功能
4、MMAP的原理是什么?
mmap
将一个文件或者其它对象映射进内存;binder_mmap
将同一块物理内存分别映射到内核虚拟地址空间
和用户虚拟内存空间
;这里申请的大小 1M-8k(#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)
,sysconf(_SC_PAGE_SIZE) = 4096)
5、Binder机制是如何跨进程的?
Binder 是一种
IPC
进程间通信机制,binder_mmap
将同一块物理内存分别映射到内核虚拟地址空间
和用户虚拟内存空间
;内核虚拟地址空间
是共享的一块内存,大小是1M-8k。
(把上面4点总结一下)
6、为什么Intent不能传递大数据
Intent 无法传递大数据是因为其内部使用了
Binder 通信机制
,所以传递数据大小是1M-8k
;实际上是比这个数据大小要小,由于binder_node数据结构打包等占用一部分大小。异步传递数据大小是1M-8k一半(508k),binder_alloc_mmap_handler
底层申请时处理alloc->free_async_space = alloc->buffer_size / 2
。
linux/drivers/android/binder_alloc.c
7、AIDL生成Java类细节
1、SDK 工具便会在项目的 gen/ 目录中生成 IBinder 接口文件。生成文件的名称与 .aidl 文件的名称保持一致,区别在于其使用 .java 扩展名(例如,IRemoteService.aidl 生成的文件名是 IRemoteService.java)
2、客户端获取IRemoteService.Stub.asInterface(service)
,实质获取代理IRemoteService.Stub.Proxy(obj)
;
服务端实现IRemoteService.Stub()
。
(Android 接口定义语言 (AIDL) : 例如IRemoteService.Stub mBinder = new IRemoteService.Stub() { ... }
;mRemoteService = IRemoteService.Stub.asInterface(service)
)
3、通信流程:3.1两个对象_data、_reply
,_data客户端数据,_reply服务端返回;3.2客户端调用mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0)
,调用到服务端onTransact()
,这里通过对应id识别对用方法
Android 接口定义语言 (AIDL)
8、四大组件底层的通信机制
主要是AMS和APP进程之间通信,实质底层是Binder机制实现。