android binder机制Bp端对象理解
2013-11-01 14:53
309 查看
我们知道通过当前进程的serviceManager对象,能够通过名称获取到当前的service对象。获取的这个对象是什么?
使用获得的sm对象,调用getService接口。我们看看getService实现了什么。
virtual sp<IBinder> getService(const String16& name) const
{
unsigned n;
for (n = 0; n < 5; n++){
sp<IBinder> svc = checkService(name);
if (svc != NULL) return svc;
LOGI("Waiting for service %s...\n", String8(name).string());
sleep(1);
}
return NULL;
}
调用了checkService,返回值就是Ibinder对象。下面是checkService的代码。
virtual sp<IBinder> checkService( const String16& name) const
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
data.writeString16(name);
remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
return reply.readStrongBinder();
}
reply是个parcel对象,相应的代码在Parcel.cpp里面
sp<IBinder> Parcel::readStrongBinder() const
{
sp<IBinder> val;
unflatten_binder(ProcessState::self(), *this, &val);
return val;
}
我们看看unflatten_binder这里面做了什么。
status_t unflatten_binder(const sp<ProcessState>& proc,
const Parcel& in, sp<IBinder>* out)
{
const flat_binder_object* flat = in.readObject(false);
if (flat) {
switch (flat->type) {
case BINDER_TYPE_BINDER:
*out = static_cast<IBinder*>(flat->cookie);
return finish_unflatten_binder(NULL, *flat, in);
case BINDER_TYPE_HANDLE:
*out = proc->getStrongProxyForHandle(flat->handle);
return finish_unflatten_binder(
static_cast<BpBinder*>(out->get()), *flat, in);
}
}
return BAD_TYPE;
}
不难理解,这个地方,第一次创建的时候,flat->type应该是BINDER_TYPE_HANDLE。
getStrongProxyForHandle这个里面创建了真正的BpBinder对象。
根据handle的不同创建了BpBinder对象。
那它怎么转化成实际的服务端对象的呢?
看下一章
使用获得的sm对象,调用getService接口。我们看看getService实现了什么。
virtual sp<IBinder> getService(const String16& name) const
{
unsigned n;
for (n = 0; n < 5; n++){
sp<IBinder> svc = checkService(name);
if (svc != NULL) return svc;
LOGI("Waiting for service %s...\n", String8(name).string());
sleep(1);
}
return NULL;
}
调用了checkService,返回值就是Ibinder对象。下面是checkService的代码。
virtual sp<IBinder> checkService( const String16& name) const
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
data.writeString16(name);
remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply);
return reply.readStrongBinder();
}
reply是个parcel对象,相应的代码在Parcel.cpp里面
sp<IBinder> Parcel::readStrongBinder() const
{
sp<IBinder> val;
unflatten_binder(ProcessState::self(), *this, &val);
return val;
}
我们看看unflatten_binder这里面做了什么。
status_t unflatten_binder(const sp<ProcessState>& proc,
const Parcel& in, sp<IBinder>* out)
{
const flat_binder_object* flat = in.readObject(false);
if (flat) {
switch (flat->type) {
case BINDER_TYPE_BINDER:
*out = static_cast<IBinder*>(flat->cookie);
return finish_unflatten_binder(NULL, *flat, in);
case BINDER_TYPE_HANDLE:
*out = proc->getStrongProxyForHandle(flat->handle);
return finish_unflatten_binder(
static_cast<BpBinder*>(out->get()), *flat, in);
}
}
return BAD_TYPE;
}
不难理解,这个地方,第一次创建的时候,flat->type应该是BINDER_TYPE_HANDLE。
getStrongProxyForHandle这个里面创建了真正的BpBinder对象。
根据handle的不同创建了BpBinder对象。
那它怎么转化成实际的服务端对象的呢?
看下一章
相关文章推荐
- Android特有Binder与IPC机制原理初探,看完应该理解一些些。
- Android源码分析之理解Binder通信机制
- Android中的Binder机制的简要理解
- 深入理解android之IPC机制与Binder框架
- [转]Android实战技术:理解Binder机制
- Android Binder机制理解
- Android系统Binder机制之二(服务代理对象 上篇)
- Android Binder机制原理(史上最强理解,没有之一)
- Android系统的Binder机制之二——服务代理对象(1)
- 深入理解Android之Binder通信机制
- 深入理解Android中的Binder机制
- Android中的Binder机制的简要理解
- Android系统Binder机制之三(服务代理对象 下篇)
- android binder机制的理解
- Android系统的Binder机制之三——服务代理对象(2)
- 理解Android binder机制的关键
- Android实战技术:理解Binder机制
- Android Binder机制原理(史上最强理解,没有之一)
- Android Binder机制----代码部分好好理解
- Android Binder机制原理(史上最强理解,没有之一)