Binder机制,从Java到C (8. ServiceManager in Native)

在第三篇 Binder机制,从Java到C (3. ServiceManager in Java) 中,讲到ServiceManager的Stub端在Native,Proxy端在Java。
实际上,还要加一句:Native里也有Proxy(BpServiceManager),因为ServiceManager也是要服务于其他native service嘛。

ServiceManager是一个在init.rc里定义的一个system process,在系统启动的时候,它就启动了。如果它挂了,那么像zygote,media,surfaceflinger这些service就都要重启,可见它有多重要了吧。
看一下它在init.rc里的定义:

./out/target/product/generic/root/init.rc

1 service servicemanager /system/bin/servicemanager
2     class core
3     user system
4     group system
5     critical
6     onrestart restart zygote
7     onrestart restart media
8     onrestart restart surfaceflinger
9     onrestart restart drm

 

servicemanager是唯一和Binder驱动直接交互的process。(系统里其他部分,都是通过libbinder使用统一的访问模型,就是Bp,Bn那些东西)

所以ServiceManager的Stub的实现和一般的native service也不一样。它沒有去实现”BnServiceManager”,而是单独写了一个class。
/frameworks/base/cmds/servicemanager/service_manager.c中,通过binder.c和binder驱动通信。

代码路径:
/frameworks/base/cmds/servicemanager/
    binder.h
    binder.c
    service_manager.c

 

 

posted @ 2014-01-02 10:55  Chloe_zhang  阅读(1088)  评论(0编辑  收藏  举报