Android进程间通信机制——Binder学习
来源:互联网 发布:红楼梦服饰知乎 编辑:程序博客网 时间:2024/06/16 18:20
Binder是Android系统中的一种进程间通信机制,有四个组件组成,分别是:Client、Server、Service Manager和Binder驱动程序。其中,Client,Server,Service Manager运行在用户空间,Binder驱动运行在内核空间。Binder就是这四个组件打起来的一个通信链路。
Binder驱动是Binder机制的核心,最终的交互就是通过Binder驱动。Service Manager负责在用户空间的Binder管理,也就是管理Client和Server。Client和Server就是通常的Client——Server通信模型中的两端,Client负责提供服务接口给上层应用或者其他进程使用,Server则是这些接口功能的真正的实现者。Android系统中的系统Service(ActivityManagerService、WindowManagerService、PowerManagerService等等)都是这种模型架构。对于应用开发者,也可以开发自己的Client,Server。可以通过获得Service Manager服务来管理自己的Server。
Android Binder系统的架构如下图所示。
如图所示,Client,Server包括Service Manager都是通过open和ioctl两个函数与Binder驱动进行通信,然后他们之间的通信就由Binder驱动进行传递,这里的Binder驱动就类似一块共享内存。
Service Manager作为Binder在User空间的管理者,他自己首先注册到Binder驱动,并告诉Binder驱动他是Binder用户空间的管理者,下面简单看下Service Manager如何实现注册并成为管理者。
Service Manager是在init进程中被启动,定义在init.rc中(system/core/rootdir):
<span style="font-size:18px;"><span style="font-size:24px;">service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart healthd onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm</span></span>
<span style="font-size:18px;"><span style="font-size:24px;">int main(int argc, char **argv){ struct binder_state *bs; bs = binder_open(128*1024); if (!bs) { ALOGE("failed to open binder driver\n"); return -1; } if (binder_become_context_manager(bs)) { ALOGE("cannot become context manager (%s)\n", strerror(errno)); return -1; } selinux_enabled = is_selinux_enabled(); sehandle = selinux_android_service_context_handle(); selinux_status_open(true); if (selinux_enabled > 0) { if (sehandle == NULL) { ALOGE("SELinux: Failed to acquire sehandle. Aborting.\n"); abort(); } if (getcon(&service_manager_context) != 0) { ALOGE("SELinux: Failed to acquire service_manager context. Aborting.\n"); abort(); } } union selinux_callback cb; cb.func_audit = audit_callback; selinux_set_callback(SELINUX_CB_AUDIT, cb); cb.func_log = selinux_log_callback; selinux_set_callback(SELINUX_CB_LOG, cb); binder_loop(bs, svcmgr_handler); return 0;}</span></span>这里主要做三件事:
1、bs = binder_open(128*1024);打开Binder设备。
2、调用binder_become_context_manager(bs),告诉Binder驱动Service Manager是Binder用户空间管理者。
3、调用binder_loop(bs, svcmgr_handler);进入无限循环中,等待“Client”的请求,这里“Client”包括上文中的Binder通信双方Client——Server。
详细的实现细节参见老罗的博文:http://blog.csdn.net/luoshengyang/article/details/6621566
- Android进程间通信机制——Binder学习
- Android进程间通信IPC机制Binder
- Android进程间通信Binder机制
- 初识Android进程间通信Binder机制
- Android 进程通信-- Binder机制
- Binder进程间通信机制——概述
- 进程间通信 binder机制
- 进程间通信机制Binder
- Android HIDL 官方文档(六)—— 使用 Binder 进程间通信机制(Using Binder IPC)
- Android进程间通信(IPC)Binder机制——Service Manager
- Android Binder通信机制学习
- Android Binder通信机制学习
- Android Binder通信机制学习
- Android学习札记53:详解Android中的进程间通信机制Binder系列文章(1)
- Android Binder,Android进程间通信机制原理详解
- Android进程间通信(IPC)机制Binder简要介绍和学习plan
- Binder进程间通信机制概述(Android系统源代码情景分析学习笔记)
- Android进程间通信(IPC)机制Binder
- 再看 AspriseOCR - OCR应用开发
- C++笔记(8) template partitial specialization模板偏特化
- Android webview和js的相互调用
- java可视化编程-eclipse安装windowbuilder插件
- Android测试教程5--模拟键盘输入
- Android进程间通信机制——Binder学习
- 多态之:深入多态
- OpenGL学习总结
- 电商安全无小事,如何有效地抵御 CSRF 攻击?
- 刷机时error: cannot load system.img问题
- 九度oj-1181-遍历链表
- Configurator
- x&(-x)如何理解
- excel导出(从数据库中)