【Android FrameWork(四)】- binder service_manager ServiceManager
文章目录
- 前言
- 源码分析
- 1.Binder
- 2.ServiceManager的启动
- 3.service_manager
- 拓展知识
- 总结
前言
ServiceManager是Android系统为开发者提供的一个服务大管家,当开机之后,由内核态进入用户态之后,会启动system_server进程,在该进程里面会对AMS,PKMS,PMS等等进行创建。然后添加到ServiceManager中。SystemServer算是一个大管家,他整合了系统的各种服务,监控着我们服务,管理服务的周期。而ServiceManager只有一个功能就是提供binder通信,让应用可以获取到系统提供的服务。
源码分析
1.Binder
Binder是Android特有的一种通信方式。Android Binder的前身是OpenBinder,后来在OpenBinder的基础上开发了Android Binder。
Android基于Linux所以支持Linux原生的IPC通信机制:共享内存、Pipe、Socket。Binder是Android特有的。
性能上:稳定性: 安全:
Binder : 一次拷贝 c/s架构 客户端和服务端 稳定 内核层校验系统来保证通信安全
共享内存:0次 不稳定会有同步问题和并发死锁问题 自定义协议
管道pipe:需要两次拷贝 单管道 效率低只能读或者只能写 自定义协议
Socket:两次拷贝 c/s架构 不好的地方消耗性能握手和挥手 自定义协议
1.binder_init 注册了Binder驱动, poll,unlocked_ioctl compat_ioctl mmap open flush release。
2.binder_open 创建了binder_proc以及初始化进程信息,todo,wait队列,并且把proc->node添加到binder_procs。
3.binder_mmap 开辟内核空间(128k),同时开辟物理内存空间(128k),然后把内核空间和物理空间进行映射,使他们2个指向同一个内存地址。这里我们看到开辟的内存大小为1页也就是4k,这么小根本不够用,其实他是在数据传递的时候按需开辟内存的,我们等讲到数据传递的时候再来看 如何开辟。
4.binder_ioctl 对binder设备进行读写操作,我们上边的代码中只带入了service_manager.c的binder_open调用的时候传递的BINDER_VERSION校验。后边我们会再进来了解的。
2.ServiceManager的启动
1.调用binder_open 打开Binder驱动,设置大小为128k。
2.调用binder_become_context_manager,设置自己成为Binder设备的上下文管理者
3.调用binder_loop让binder进入loop状态,并且等待客户端请求并处理,处理完成之后会把数据写入readbuf,进行svcmgr_handler回调。
注意:Binder的ioctl函数会阻塞。
int main(int argc, char** argv)
{
struct binder_state *bs;
union selinux_callback cb;
char *driver;
if (argc > 1) {
driver = argv[1];
} else {
driver = "/dev/binder";
}
bs = binder_open(driver, 128*1024);//调用binder_open 打开binder驱动 传递大小为128*1024也就是128k
//………………
if (binder_become_context_manager(bs)) {//设置自己成为binder设备的上下文管理者
}
//………………
//调用binder_loop 让binder进入loop状态,等待客户端连接,并且传入回调函数svcmgr_handler
binder_loop(bs, svcmgr_handler);
return 0;
}
3.service_manager
1,bind_open :打开了binder驱动 映射了内存空间 大小是128k
2,调binder_becom_context_manager 设置 让自己成为binder设备的上下文管理者
3,调用binder_loop 让service_manager进入死循环状态,binder设备进入loop的状态 ioctl(BINDER_WRITE_READ)
4,binder_parse客户端数据进行解析,并且进行回调 svcmgr_handler
拓展知识
-
ServiceManager.rc比我们的zygote更先执行,这里执行文件的大小顺序:core-> main->late_start)
-
Binder传统ipc怎么进行通信的?
系统里进程之间是相互隔离的,a进程无法直接访问b进程,每个进程里分为用户空间和内核空间 -
性能上:稳定性: 安全:
Binder : 一次拷贝 c/s架构 客户端和服务端 稳定 内核层校验系统来保证通信安全
共享内存:0次 不稳定会有同步问题和并发死锁问题 自定义协议
管道pipe:需要两次拷贝 单管道 效率低只能读或者只能写 自定义协议
Socket:两次拷贝 c/s架构 不好的地方消耗性能握手和挥手 自定义协议