在Android系统,由于内存空间一般比较有限,为了方便进程间共享数据,Android提供了一种匿名共享内存的机制。为了方便的使用匿名共享内存机制,系统提供了Java的调用接口MemoryFile和C++调用接口MemoryHeapBase和MemoryBase。
MemoryHeapBase:一般用于在进程间共享一个完整的匿名共享内存块
MemoryBase: 一般用于在进程间共享一个匿名共享内存块的其中一部分。
MemoryBase接口是建立在MemoryHeapBase接口的基础上实现的,他们都可以作为一个Binder对象在进程间通信。下面我们主要来分析者两个类:
所有的Binder对象都必须实现IInterface接口,无论是Service端实体对象,还是Client的引用对象,通过这个接口的asBinder成员函数我们可以获得Binder对象的IBinder接口,然后通过Binder驱动程序把它传输到另外一个进程,当一个类的对象作为Service端的实体对象时,还必须实现一个目标类BnInterface,它里面有一个重要的成员函数onTransact,当Client端引用请求Server端对象执行命令时,Binder系统会调用Bnxx类的onTransact成员函数来执行具体的命令。当一个类作为Server端实体时,它需要继承于BBinder类,这是一个实现了IBinder接口的类,它里面有一个重要的成员函数transact,当我们从Server端线程中接收到Client端的请求时,会调用注册在这个线程中的BBinder对象的transact函数,将这些请求发送给Bnxx类的onTransact成员函数。
IMemoryHeap 类主要定义几个重要的操作匿名共享内存的方法。
frameworks/base/include/binder/IMemory.h文件中:
class IMemoryHeap : public IInterface
{
public:
DECLARE_META_INTERFACE(MemoryHeap);
// flags returned by getFlags()
enum {
READ_ONLY = 0x00000001
};
virtual int getHeapID() const = 0;
virtual void* getBase() const = 0;
virtual size_t getSize() const = 0;
virtual uint32_t getFlags() const = 0;
virtual uint32_t getOffset() const = 0;
// these are there just for backward source compatibility
int32_t heapID() const { return getHeapID(); }
void* base() const { return getBase(); }
size_t virtualSize() const { return getSize(); }
};
其中几个纯虚的成员函数:
getHeapID() 获得匿名共享内存块的打开文件描述符
getBase() 获得匿名共享内存的基地址
getSize() 获得匿名共享内存块的大小
BnMemoryHeap 类继承于BnInterface<IMemoryHeap>
class BnMemoryHeap : public BnInterface<IMemoryHeap>
{
public:
virtual status_t onTransact(
uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
BnMemoryHeap();
protected:
virtual ~BnMemoryHeap();
};
MemoryHeapBase 类主要用来实现上面的IMemoryHeap类的几个成员函数:
frameworks/base/include/binder/MemoryHeapBase.h
class MemoryHeapBase : public virtual BnMemoryHeap
{
public:
MemoryHeapBase(int fd, size_t size, uint32_t flags = 0, uint32_t offset = 0);
MemoryHeapBase(const char* device, size_t size = 0, uint32_t flags = 0);
MemoryHeapBase(size_t size, uint32_t flags = 0, char const* name = NULL);
virtual ~MemoryHeapBase();
/* implement IMemoryHeap interface */
virtual int getHeapID() const;
virtual vo