美文网首页
一个系统服务(2种)是如何启动的

一个系统服务(2种)是如何启动的

作者: 六月小微风Online | 来源:发表于2019-10-16 23:46 被阅读0次
    1. 系统服务和应用服务的区别。
    • 系统服务是采用" 注册 "的方式
    • 应用服务是采用绑定Binder
    2. 反思:如果要自己设计一个系统服务,要考虑什么?

    (1)如何让别人很方便的使用(拿到binder对象)
    (2)如何将自己的服务开放出去(参考注册到SM的方案)
    (3)IPC
    (*4)客户端的设计:添加一个fetcher缓存service(可以选择Service[]数组作为存储),fetcher和name是一对Map

    getSystemService(String name){
    //1.由name获取  ServiceFetcher。Map.put(name,fetcher);
    //2.再通过fetcher.getServie()
    }
    
    3. 应用端真正获取系统服务的过程

    系统服务用起来很方便,知道其名字Context.ACTIVITY_SERVICE就可以使用了。但是它的真正实现还是有些复杂的。

    private static final Singleton<IActivityManager> IActivityManagerSingleton =
                new Singleton<IActivityManager>() {
                    @Override
                    protected IActivityManager create() {
                        //在ServiceManager端返回binder代理
                        final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
    
                        //AIDL生成Stub类
                        final IActivityManager am = IActivityManager.Stub.asInterface(b);
                        return am;
                    }
                };
    
    4. 如何将系统服务注册到ServiceManager

    (1)在Service操作IServiceManager,传入的是binder实体
    getIServiceManager.addService(name,service,……);
    (2)而在ServiceManager端收到的是Service的代理binder对象

    第一类系统服务的注册时机是SystemServer启动的时候:

    • 启动binder机制
    • 启动各类系统服务(这里就包括Service的注册)
    • 进入Loop循环

    第二类系统服务(native)的注册时机
    在init.rc中添加其配置

    5. 启动Binder机制
    • 打开binder驱动
    • 映射内存,分配缓冲区
    • 启动binder线程,进入binder loop

    可以启动一个线程,注册为binder线程,如果打印tid列表,可以看到很多binder线程

    相关文章

      网友评论

          本文标题:一个系统服务(2种)是如何启动的

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