没有合适的资源?快使用搜索试试~ 我知道了~
AndroidIPC通讯机制源码分析.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 18 浏览量
2021-10-02
11:07:02
上传
评论
收藏 213KB PDF 举报
温馨提示
试读
14页
AndroidIPC通讯机制源码分析.pdf
资源推荐
资源详情
资源评论
----Albertchen
Binder 通信简介:
Linux 系统中进程间通信的方式有 :socket, named pipe,message queque, signal,share
memory 。Java 系统中的进程间通信方式有 socket, named pipe 等, android 应用程序理所当然可以
应用 JAVA 的 IPC 机制实现进程间的通信,但我查看 android 的源码,在同一终端上的应用软件的通 信
几乎看不到这些 IPC 通信方式,取而代之的是 Binder 通信。 Google 为什么要采用这种方式呢,这取决
于 Binder 通信方式的高效率。 Binder 通信是通过 linux 的 binder driver 来实现的, Binder 通信操作
类似线程迁移 (thread migration) ,两个进程间 IPC 看起来就象是一个进程进入另一个进程执行代码然后
带着执行的结果返回。 Binder 的用户空间为每一个进程维护着 一个可用的线程池,线程池用于处理到来
的 IPC 以及执行进程本地消息, Binder 通信是同步而不是异步。
Android 中的 Binder 通信是基于 Service 与 Client 的,所有需要 IBinder 通信的进程都必须
创建一个 IBinder 接口,系统中 有一个进程管理所有的 system service,Android 不允许用户添加非授
权的 System service, 当然现在源码开发了,我们可以修改一些代码来实现添加底层 system Service 的
目的。对用户程序来说,我们也要创建 server, 或者 Service 用于进程间通信,这里有一个
ActivityManagerService 管理 JAVA 应用层所有的 service 创建与连接 (connect),disconnect, 所有的
Activity 也是通过这个 service 来启动,加载的。ActivityManagerService 也是加载在 Systems Servcie
中的。
Android 虚拟机启动之前系统会先启动 service Manager 进程,service Manager 打开 binder
驱动,并通知 binder kernel 驱动程序这个进程将作为 System Service Manager ,然后该进程将进入
一个循环,等待处理来自其他进程的数据。用户创建一个 System service 后,通过
defaultServiceManager 得到一个远程 ServiceManager 的接口,通过这个接口我们可以调用
addService 函数将 System service 添加到 Service Manager 进程中,然后 client 可以通过 getService
获取到需要连接的目的 Service 的 IBinder 对象,这个 IBinder 是 Service 的 BBinder 在 binder kernel
的一个参考,所以 service IBinder 在 binder kernel 中不会存在相同的两个 IBinder 对象,每一个 Client
进程同样需要打开 Binder 驱动程序。对用户程序而言,我们获得这个对象就可 以通过 binder kernel 访
问 service 对象中的方法。 Client 与 Service 在不同的进程中,通过这种方式实现了类似线程间的迁移的
通信方式,对用户程序 而言当调用 Service 返回的 IBinder 接口后,访问 Service 中的方法就如同调用
自己的函数。
下图为 client 与 Service 建立连接的示意图
首先从 ServiceManager 注册过程来逐步分析上述过程是如何实现的。
ServiceMananger 进程注册过程源码分析:
Service Manager Process (Service_manager.c ):
Service_manager 为其他进程的 Service 提供管理,这个服务程序必须在 Android Runtime
起来之前运行,否则 Android JAVA Vm ActivityManagerService 无法注册。
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024); // 打开 /dev/binder 驱动
if (binder_become_context_manager(bs)) {// 注册为 service manager in binder
kernel
LOGE("cannot become context manager (%s)\n", strerror(errno));
return -1;
}
svcmgr_handle = svcmgr;
binder_loop(bs, svcmgr_handler);
return 0;
}
首先打开 binder 的驱动程序然后通过 binder_become_context_manager 函数调用 ioctl 告诉
Binder Kernel 驱动程序这是一个服务管理进程,然后调用 binder_loop 等待来自其他进程的数据。
BINDER_SERVICE_MANAGER 是服 务管理进程的句柄,它的定义是:
/* the one magic object */
#define BINDER_SERVICE_MANAGER ((void*) 0)
如果客户端进程获取 Service 时所使用的句柄与此不符, Service Manager 将不接受 Client 的请
求。客户端如何设置这个句柄在下面会介绍。
CameraSerivce 服务的注册 (Main_mediaservice.c )
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate(); //Audio 服务
剩余13页未读,继续阅读
资源评论
资料大全
- 粉丝: 14
- 资源: 26万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功