Android使用Binder机制来实现IPC, Binder通信是借助linux的binder driver来实现的,两个进程间IPC感觉就象是一个进程进入另一个进程执行代码一样,而且在本地能返回远端函数的返回结果。Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用来处理到来的调用请求的消息,包括请求的消息,和远端响应的消息。

Android中的Binder通信是基于Service与Client的架构,所有需要IBinder通信的进程都必须创建一个IBinder接口,系统中有一个系统服务管理器,这是个特殊的服务器,Android 初始化的时候就会自动起来,并来为其他应用服务器提供服务,包括增加某一服务,查询获取某一服务等。

那么针对我们的Camera 系统,我们要有以下四个概念,

1 系统服务管理器 service_manager

2 Camera服务器 CameraService

3 Camera 客户端 Camera app.

4 Binder 驱动核 Binder Driver

大概的过程简述如下:

Android 系统初始化后运行系统服务管理器,系统服务管理器等待并响应Camera 应用服务器的注册请求,这样Camera 应用服务器将告诉系统服务器可以提供Camera 的应用服务,系统服务管理器同时在Binder Driver给生成一个Binder号

Camera 应用获取Camera 服务句柄,也就是那个Biner号,有这个Binder,系统就可以通过一种机制对应到Camera 服务。Camera应用通过这个Binder,在本地调用Camera服务提供的函数(即服务),通过IPC操作,对应到Camera服务器端对应的函数中,比如connect(),这时Camera应用在这个点将挂起,Camera服务将被唤醒执行这个服务connect(),在Camera服务器端执行完成后,再反馈结果给Camera应用,Camera应用在这时又被唤醒并继续往下执行.就好像Camera应用调用connect()是在本地完成一样.

以上过程可以分成以下流程来理解,

一,系统服务管理器service_manager启动。在Binder驱动核中注册一个特殊节点0,并等待其他服务来注册,查询。

二, Camera服务器注册/添加到系统服务管理器中,在系统服务管理器service_manager中将生成一个Binder号(x)给Camera服务器。

三, Camera客户端向系统服务管理器service_manager获取一个Camera服务代理。系统服务器将返回那个生成的Binder号 (x)给这个Camera客户端,并转化为ICameraService对象。

四, Camera客户端通过ICameraService接口中的函数 [比如connect()]调用,中途经过IPC操作,调用到Camera服务器中的CameraService::connect(),并把结果反馈给Camera客户端,

后续将按照以上流程来分析.

更多相关文章

  1. Android内核开发:如何统计系统的启动时间
  2. Android编译系统中头文件搜索路径的顺序问题
  3. MIUI 系统 BUG,Android 调用相机崩溃?将拍照适配方案进行到底!
  4. android 下载管理器
  5. 开启本地服务器,利用二维码进行通信[Demo]
  6. android4.0 input子系统分析(kernel部分)

随机推荐

  1. Android笔记:SlidingDrawer
  2. Android 自定义ViewGroup 实战篇 -> 实现
  3. It’s Android Time
  4. [置顶] android Studio 配置LUA 开发环境
  5. Android界面开发简介
  6. 在 Android(安卓)字符串资源中直接使用 E
  7. Android中Shape和Selector的结合使用。
  8. Android(安卓)build.gradle配置buildConf
  9. 开发具备语音识别功能的 Android* 应用
  10. Android介绍