美文网首页AndroidDevGpt
Android FrameWork (四)

Android FrameWork (四)

作者: Mr_不靠谱_先森 | 来源:发表于2023-04-14 19:43 被阅读0次

    Android FrameWork (四)

    binder &service_manager && ServiceManager


    知识回顾:

    init
    ZygoteInit
    Systemserver


    源码分析:

    会比较麻烦的一个模块:
    横跨我们应用层- framework-驱动层 java- native-内核

    client binder server之间的关系图:


    client_binder_server关系图.png

    SystemServer.java
    ActivityManagerService.java
    SystemServiceManager.java
    ServiceManager.java

    关系图:

    暂存

    ServiceManager.rc:
    service_manager.c:


    总结:

    1,bind_open :打开了binder驱动 对Binder_version校验 映射了内存空间 大小是128k
    2,调binder_becom_context_manager 设置 让自己成为binder设备的上下文管理者
    3,调用binder_loop 让service_manager进入死循环状态,binder设备进入loop的状态 ioctl(BINDER_WRITE_READ)
    4,binder_parse客户端数据进行解析,并且进行回调 svcmgr_handler处理


    binder.c

    总结:

    1,binder_init: 函数 注册binder驱动(mmap open flush release)
    2,binder_open: 创建binder_proc,并且初始化进程信息,pid todo wait
    把binder_proc 添加到binder_procs
    3,binder_mmap: 开辟内核空间128k 同时开辟物理内存 把内核空间和物理空间进行映射,让他们两个指向同一个地址
    4,binder_ioctl: 对设备进行读写操作


    servicemanager/binder.c
    #######总结:
    一个串联关系图:


    binder_service_manager关系图.png
    补充前提知识:

    Binder传统ipc怎么进行通信的?
    系统里进程之间是相互隔离的,a进程无法直接访问b进程,每个进程里分为用户空间和内核空间


    截屏2023-04-13 下午4.29.01.png

    sp:StrongPointer.h. 智能指针

    拓展知识:
    • 性能上:稳定性: 安全:
      Binder : 一次拷贝 c/s架构 客户端和服务端 稳定 内核层校验系统来保证通信安全
      共享内存:0次 不稳定会有同步问题和并发死锁问题 自定义协议
      管道pipe:需要两次拷贝 单管道 效率低只能读或者只能写 自定义协议
      Socket:两次拷贝 c/s架构 不好的地方消耗性能握手和挥手 自定义协议

    • (拓展知识:ServiceManager.rc比我们的zygote更先执行,这里执行文件的大小顺序:core-> main->late_start)


    面试题:

    1,binder是什么?原理是什么?
    binder是一个虚拟的硬件设备,它是一个驱动程序,也是Android特有的一种通信方式,它的好处是一次拷贝效率高,把我们的用户空间,内核空间,物理内存都映射在了一个地址,这样它就少了一次拷贝,也可以参考前期讲的集中通信方式管道 进行讲讲区别,也可以讲讲几个函数方法比如binder_open binder_mmap binder_ioctl几个函数进行讲解一下。
    2,binder是怎么进行工作的?
    这个话题比较大,参考流程图进行分析。以命令流的方式进行讲解 比如 client binder server之间的关系图进行讲解,如果更专业的方式就是代码的调用流程图更加的专业。
    3,binder是给我们的每个应用分配的内存是多少?如果不够用了怎么办?
    ProcessState.cpp:中会设置常量大小
    binder_vm_size(1M-8k). 的大小。默认给我们每个应用是这些
    service_manager 比较特殊是128k
    如果不够用了怎么办?我们可以用其它方式的ipc机制,比如说共享内存,socket,可以展开讲讲几种的区别
    4,binder的线程数是多少?
    16个
    5,其它?

    相关文章

      网友评论

        本文标题:Android FrameWork (四)

        本文链接:https://www.haomeiwen.com/subject/rcloddtx.html