BnServiceManager 去哪了

最近重新在撸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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值