Android开发之Memory类的分析

本文详细分析了Android系统中Memory类及其相关实现,包括MemoryHeapBase和MemoryBase,它们用于进程间共享匿名内存。MemoryHeapBase用于创建和管理整个匿名共享内存块,而MemoryBase则用于共享内存的一部分。通过BpMemoryHeap,Client端可以访问Server端的MemoryHeapBase,实现跨进程数据共享。匿名共享内存的创建、映射和管理涉及Binder机制,如BnInterface、BpInterface和IMemoryHeap接口的交互。
摘要由CSDN通过智能技术生成

       在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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值