Android进程间通信机制——Binder学习
2015-11-24 11:35
483 查看
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):
其源码实现位于(Android M):frameworks/native/cmds/servicemanagerservice_manager.c
这里主要做三件事:
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
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>
其源码实现位于(Android M):frameworks/native/cmds/servicemanagerservice_manager.c
<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
相关文章推荐
- Github项目解析(一)-->上传Android项目至github
- 国内android aosp源代码下载方法
- Android 各种make命令
- Android在sd卡生成log文件
- Android Studio快捷键
- Android数据存储
- android解决xml里设置高度跟代码里的设置高度不同
- Android MediaPlayer状态机
- android应用中去掉标题栏的方法
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- android Apk打包过程概述_android是如何打包apk的
- Android开机自启动程序
- 关于Android的.so文件你所需要知道的
- Android AutoLayout全新的适配方式 堪称适配终结者
- Android res/raw文件以及raw与res/assets异同
- android-Intents and Intent Filters and Common Intents
- Android读取assets目录下文件数据内容
- Android res/raw文件 读取文件
- Android 触摸及手势操作GestureDetector
- 【Android】SDK和API Level版本的对应关系