最近重新在撸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:
- int svcmgr_handler(struct binder_state *bs,
- struct binder_txn *txn,
- struct binder_io *msg,
- struct binder_io *reply)
- {
- struct svcinfo *si;
- uint16_t *s;
- unsigned len;
- void *ptr;
- uint32_t strict_policy;
- int allow_isolated;
- ......
- switch(txn->code) {
- case SVC_MGR_ADD_SERVICE:
- s = bio_get_string16(msg, &len);//service name
- ptr = bio_get_ref(msg);//handle
- allow_isolated = bio_get_uint32(msg) ? 1 : 0;
- if (do_add_service(bs, s, len, ptr, txn->sender_euid, allow_isolated))
- return -1;
- break;
- ......
- }
总结下:正面分析更快速点,确定肯定在servicemanager 里,在结合binder驱动的代码BINDER_WRITE_READBINDER_SET_CONTEXT_MGR 这些就能很快找到了。RTFSC才是王道
老罗的参考
http://blog.youkuaiyun.com/luoshengyang/article/details/6627260