特殊的系统服务:ServiceManager

1.有几个重要的问题需要理清楚:

(1)ServiceManager的启动流程
(2)ServiceManager的binder对象如何被获取
(3)如何向ServiceManager添加系统服务
(4)如何由ServiceManager获取系统服务

2.ServiceManager的启动流程
  • 启动进程
    注意ServiceManager和其他进程的区别
  • 启动binder机制
    (1)打开binder驱动(2)映射内存(3)注册binder线程
  • 向binder驱动注册
    告知binder驱动,当前ServiceManager已经就绪
  • 进入binder循环
    在这个LOOP中不断的读请求,处理请求
//伪代码
int main(int argc , char **argv){
    //分配内存,然后内存映射
    bs = binder_open(128*1024);

    //告知binder驱动,ServiceManager已经就绪
    binder_become_context_manager(bs);

    binder_loop(bs,svcmgr_handler);
    //两个阶段:1. 将当前线程注册为binder线程,告诉binder驱动,当前的线程是可以处理binder请求的
//int res = ioctl(fd,BINDER_WRITE_READ,binder_write_read); 将binder_write_read的数据写入到fd(binder驱动)中
    //2. for(;;)循环中再用ioctl不断的读取请求,循环过程中还会回调func处理请求

    return 0;
}

3.ServiceManager的binder对象如何被获取

实际的代理是new BpBinder(handler );//handler == 0

4.如何向ServiceManager添加系统服务
  • 获取ServiceManager的binder对象
  • 发起addService(1,2)的binder调用
    注意,其中需要传入两个关键参数:(1)服务的名称(2)该服务的binder实体对象
5.如何由ServiceManager获取系统服务
  • 获取ServiceManager的binder对象
  • 发起getService(1)的binder调用
    注意,需要传入一个参数:服务的名称
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容