# sharedMemory **Repository Path**: kavin_tian/sharedMemory ## Basic Information - **Project Name**: sharedMemory - **Description**: Android共享内存 API 21 ~ 36 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-20 - **Last Updated**: 2026-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SharedMemory Android 进程间共享内存通信示例项目 ## 项目简介 本项目演示了如何使用 Android 的 `MemoryFile` API 实现高效的进程间通信(IPC)。通过共享内存机制,两个应用可以在无需频繁数据拷贝的情况下快速传递大量数据。 ## 功能特点 - **共享内存通信**:利用 Android Ashmem 匿名共享内存实现高效数据传输 - **AIDL 远程服务**:基于 AIDL 接口定义跨进程服务调用 - **双向数据交互**:支持服务端和客户端双向读写共享内存 - **简单易用**:提供清晰的 API 接口,便于集成和扩展 ## 技术原理 ### 核心机制 1. **MemoryFile**:Android 提供的匿名共享内存封装类 2. **ParcelFileDescriptor**:用于跨进程传递文件描述符 3. **FileChannel**:用于读写共享内存映射 ### 数据协议 共享内存区域包含以下头部信息: - **Magic**:魔数,用于验证数据有效性 - **Version**:协议版本号 - **Length**:数据长度 - **Sequence**:序列号,用于检测数据更新 - **Data**:实际数据内容 ## 项目结构 ``` sharedMemory/ ├── client/ # 客户端模块 │ ├── src/main/ │ │ ├── aidl/ # AIDL 接口定义 │ │ ├── java/ # Java 源码 │ │ │ └── com/example/ipcshm/client/ │ │ │ └── MainActivity.java │ │ └── res/ # 资源文件 │ └── build.gradle ├── server/ # 服务端模块 │ ├── src/main/ │ │ ├── aidl/ # AIDL 接口定义 │ │ ├── java/ # Java 源码 │ │ │ └── com/example/ipcshm/server/ │ │ │ ├── ServerActivity.java │ │ │ └── ShmService.java │ │ └── res/ # 资源文件 │ └── build.gradle └── build.gradle # 根项目配置 ``` ## 快速开始 ### 环境要求 - Android Studio Arctic Fox 或更高版本 - Android SDK 21 (Android 5.0) 或更高版本 - Gradle 7.0+ ### 编译运行 ```bash # 克隆项目后,在项目根目录执行 ./gradlew assembleDebug ``` ### 安装部署 1. 先安装 server 模块(服务端应用) 2. 再安装 client 模块(客户端应用) 3. 确保两个应用都已安装 ## 使用说明 ### 服务端使用 1. 启动 server 应用 2. 服务会自动创建共享内存区域 3. 可在输入框中编辑消息,数据会自动写入共享内存 4. 共享内存数据会实时显示在界面上 ### 客户端使用 1. 启动 client 应用 2. 点击"绑定服务"按钮连接服务端 3. 连接成功后会自动读取共享内存中的数据 4. 在输入框中编辑消息,数据会写入共享内存供服务端读取 5. 服务端会实时更新显示客户端发送的消息 ### 数据流向 ``` 客户端输入 → 写入共享内存 → 服务端读取显示 服务端输入 → 写入共享内存 → 客户端读取显示 ``` ## 核心代码解析 ### AIDL 接口定义 ```aidl interface IShmService { ParcelFileDescriptor getSharedMemory(); } ``` 服务端通过 `getSharedMemory()` 方法将共享内存的文件描述符传递给客户端。 ### 服务端实现 (ShmService.java) - 在 `onCreate()` 中创建 MemoryFile - 通过反射获取 MemoryFile 的文件描述符 - 提供 `getSharedMemory()` 接口供客户端获取共享内存 ### 客户端实现 (MainActivity.java) - 绑定远程服务获取 IBinder - 调用 AIDL 接口获取文件描述符 - 使用 FileChannel 映射共享内存进行读写 ## 注意事项 1. **权限要求**:两个应用需要安装在同一设备上 2. **包名匹配**:客户端配置的包名需与服务端实际包名一致 3. **数据安全**:共享内存数据无进程隔离保护,敏感数据需额外加密 4. **内存管理**:使用完毕后需正确释放资源,避免内存泄漏 ## 扩展应用 本项目可作为以下场景的基础: - 高性能 IPC 通信 - 大数据传输场景 - 实时数据同步 - 跨进程状态共享