ServiceManager与SystemService 是Android 系统中与服务相关的两个进程
我们可以看到systemserver 进程是由zygote 进行孵化出来的,而servicemanager 进行的父进程是init 进程
systemserver 的实现 是在framework 层
看下 源码:
run()继续跟踪
可以看到Android 系统中所有的服务都是在run()中进行启动。
2 启动后的服务该怎么管理与使用呢?
这里我们就要引申出servicemanager 了。
在framework 内 我们看下ServiceManagerNative 类
上面我们说了 ServiceManager 与 SystemService 分别是两个独立的进程,他们两之间要进行通信,必须使用进程间通信,这里的机制是通过binder 。
servicemanager 是管理binder 十分重要的类。PMS ,AMS 等通过上层ServiceManagerNative 类将 相对应的信息注册到 native 层的 servicemanager中,native 保留一个int类型的handle地址,
地址指向的地址就是相关服务。serviceManager 会给相关服务分配一个4k的物理内存。
所以:服务的启动跟所在的进程都是systemserver 进程中,但是注册跟获取服务都是需要通过servicemanager。
我们清楚了servicemanager 是一个单独的进程,那就一定有main()函数 我们跟着源码进行挖,看看我们上面说的是不是真的跟binder 有关联
这边调用了一个binder_open方法,我们在同级目录下的binder.c文件中查看有么有该方法
我们看到 这个binder_open 方法传入的参数 是一个路径,从名字可以看到 dev/binder,这里传入的就是驱动层的binder文件的路径。
有兴趣的可以继续向下看驱动层binder.c 的源码,我这边附给大家,这块内容还是很多了,涉及到整个binder进程间通信,这里就不过多介绍了。