BnServiceManager 去哪了

来源:互联网 发布:网络布线怎么做 编辑:程序博客网 时间:2024/03/29 06:37

最近重新在撸binder的代码。

有个疑问,应用程序要获取服务必须依赖smgr,那它有是怎么样和smgr接上火的?毕竟在不同的进程空间。

发现有同学跟我有 同样的疑问。


http://www.oschina.net/question/698713_65247?sort=time

以addservice 为例,到底没找到实现。

189status_t BnServiceManager::onTransact(190    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)191{192    //printf("ServiceManager received: "); data.print();193    switch(code) { 208        case ADD_SERVICE_TRANSACTION: {209            CHECK_INTERFACE(IServiceManager, data, reply);210            String16 which = data.readString16();211            sp<IBinder> b = data.readStrongBinder();212            status_t err = addService(which, b);213            reply->writeInt32(err);214            return NO_ERROR;215        } break;216        case LIST_SERVICES_TRANSACTION: {217            CHECK_INTERFACE(IServiceManager, data, reply);218            Vector<String16> list = listServices();219            const size_t N = list.size();220            reply->writeInt32(N);221            for (size_t i=0; i<N; i++) {222                reply->writeString16(list[i]);223            }224            return NO_ERROR;225        } break;226        default:227            return BBinder::onTransact(code, data, reply, flags);228    }229}230


BnServiceManager 实现在servicemanager
SVC_MGR_ADD_SERVICE:
  1. int svcmgr_handler(struct binder_state *bs,  
  2.                    struct binder_txn *txn,  
  3.                    struct binder_io *msg,  
  4.                    struct binder_io *reply)  
  5. {  
  6.     struct svcinfo *si;  
  7.     uint16_t *s;  
  8.     unsigned len;  
  9.     void *ptr;  
  10.     uint32_t strict_policy;  
  11.     int allow_isolated;  
  12.   
  13.     ......  
  14.   
  15.     switch(txn->code) {  
  16.     case SVC_MGR_ADD_SERVICE:  
  17.         s = bio_get_string16(msg, &len);//service name  
  18.         ptr = bio_get_ref(msg);//handle  
  19.         allow_isolated = bio_get_uint32(msg) ? 1 : 0;  
  20.         if (do_add_service(bs, s, len, ptr, txn->sender_euid, allow_isolated))  
  21.             return -1;  
  22.         break;  
  23.     ......  
  24.     }  
总结下:正面分析更快速点,确定肯定在servicemanager 里,在结合binder驱动的代码 
 BINDER_WRITE_READ 
 BINDER_SET_CONTEXT_MGR 这些就能很快找到了。
RTFSC才是王道

老罗的参考

http://blog.csdn.net/luoshengyang/article/details/6627260

0 0