【Android系列2.0 进程 --- SystemManager服务】

ServiceManager服务

  • Binder进行IPC时的ContextManager: 通过service的名称,返回binder的句柄,使Client进行IPC
  • 由init进程扫描init.rc启动的二进制可执行文件
service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm
  • 其自身句柄为0
  • 在Shell,Native和Java层都有获取ServiceManager的方法
//Shell: service service_name method_name method_param
adb shell service call phone ***

//Native
sp defaultServiceManager()

//Java
android.os.ServiceManagerNative
android.os.ServiceManager
Context.getSystemService
  • 代码 frameworks/base/cmds/servicemanager 目录下的binder.h, binder.c, service_manager.c
  • service_manager main方法入口
    • 调用binder_open,打开binder设备文件,获取/dev/binder描述符
    • 调用binder_become_context_manager 通知binder驱动程序,自己是binder的上下文管理者(守护进程),服务索引值为0
    • 调动binder_loopde无穷循环
    • 进入阻塞状态,直到/dev/binder 中产生transaction(也就是Client端请求:addService、checkService和listServices),调用svcmgr_handler回调函数处理

你可能感兴趣的:(Android)