今天要讲的内容相对冷门,日常开发中的使用率较低。但是,在某些场景下,它也许可以带给我们一个新的思路,帮我们解决一些棘手的问题,因此我觉得有必要谈一谈Android中的匿名共享内存(Ashmem)。
首先来看一下什么是匿名共享内存(Ashmem)。Ashmem是一种共享内存的机制,它利用了Linux的mmap系统调用,将不同进程中的同一段物理内存映射到进程各自的虚拟地址空间,从而实现高效的进程间共享。它以驱动程序的形式实现在内核空间。它有两个特点,一是能够辅助内存管理系统来有效地管理不再使用的内存块,二是它通过Binder进程间通信机制来实现进程间的内存共享。Ashmem的两个特点就是共享和高效。共享是指可以在不同进程间共享信息,高效则是因为不同进程都是直接进行的内存操作,相对于其他的进程间通信方式来讲,这种方式会更快一些。
Android系统的匿名共享内存系统的主体是以驱动程序的形式实现在内核空间的,同时,在系统运行时库和应用程序框架层提供了访问接口,其中,在系统运行时库提供了C/C++调用接口,而在应用程序框架层提供了Java调用接口。Android开发中通常只需要调用Java接口,而实际上,应用程序框架层的Java调用接口是通过JNI方法来调用系统运行时库的C/C++调用接口,最后进入到内核空间的Ashmem驱动程序去的。
在Android中,主要提供了MemoryFile这个类来供应用使用匿名共享内存。在Android应用程序框架层,提供了一个MemoryFile接口来封装了匿名共享内存文件的创建和使用,通过JNI调用底层C++方法。
前面说到可以利用匿名共享内存来实现进程间内存共享