一个系统服务(2种)是如何启动的
2019-10-16 本文已影响0人
六月小微风Online
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线程