【Android FrameWork(四)】- binder & service_manager & ServiceManager

ServiceManager是Android系统的关键组件,负责管理AMS、PKMS等服务。它基于Binder通信,Binder具有高效、稳定和安全的特性。文章详细介绍了Binder的初始化、ServiceManager的启动过程,以及ServiceManager如何进入循环等待客户端请求。同时,对比了Binder与其他IPC机制如共享内存、管道和Socket在性能和安全上的差异。
摘要由CSDN通过智能技术生成


前言

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架构 不好的地方消耗性能握手和挥手 自定义协议

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值