美文网首页
一个系统服务(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