我记得Android中的Intent传递数据时,都基于序列化。 那么,也就是说,发送方的数据会被备份一份,然后传给接受方。 这样,大数据量的场合不适合。问题是, 我不知道Android架构的核心机制,Binder IPC进行远程调用时,调用参数究竟是如何传递的,也是进行备份后传递给远程, 还是直接共享本进程的内容给远程进程,从而使得不需要大数据量的备份和传送?? 比如, 利用Binder机制, 客户端需要调用Server端的一个API,其中输入参数中包含一个指向Client进程中的一块大数据量Buffer,如1MB, 那么,此时调用时,底层的Parcel是怎么传递的, 是将Client中的这1MB进行复制再共享给Server进程吗? 还是,直接将该地址指正共享给Server进程,让其直接访问??
希望大虾解答一下~~~谢谢~~~
希望大虾解答一下~~~谢谢~~~
理论上,任何Server只要将其Binder加入Binder驱动, 然后Client在运行时只要能得到Server的Binder,即可创建出BpService,然后就可以远程调用了。 关键是,Client运行时不可能动态的获取Service的Binder, 所以需要ServiceManager的介入~~~
{
return write(str, strlen(str)+1);
}status_t Parcel::write(const void* data, size_t len)
{
void* const d = writeInplace(len);
if (d) {
memcpy(d, data, len);
return NO_ERROR;
}
return mError;
}
服务器端通过 Parcel 的 writeStrongBinder(const sp<IBinder>& val); 来传递 sp<MemoryHeapBase>
a、服务端从ashmem中分配内存空间
memHeap = new MemoryHeapBase(size, 0, "elf mem heap");
memBase = new MemoryBase(memHeap, 0, size);
b、服务端返回共享内存memHeap
reply->writeStrongBinder(memBase->getMemory(&offset, &size)->asBinder());
reply->writeInt32(offset);
reply->writeInt32(size);
c、客户端读取共享内存IMemoryHeap
sp<IBinder> heap = reply.readStrongBinder();
ssize_t o = reply.readInt32();
size_t s = reply.readInt32();
sp<IMemoryHeap> mHeap = interface_cast<IMemoryHeap> (heap);
d、客户端使用共享内存
char * buf = static_cast<char *> (mHeap->base());
memset(&buf[offset], i, size);
audoi 和 camera 就是采用的这种方式将数据提供给客户端的。
BINDER 通过 PARCEL 传递的参数一般都是小的,如果要从摄像头服务端读取一张图片,用的就是传递的共享内存地址
我想,使用LINUX的命名内存共享也应该是可以的吧,没试过。