Android 11(API 30)BlobStoreManager跨应用共享数据读写实现疑问
BlobStoreManager正确使用逻辑说明
核心认知纠偏
你之前的逻辑死循环本质是对BlobHandle的参数设计、跨应用传递链路存在误解:
BlobHandle中的SHA-256参数,是系统基于写入方实际提交的业务内容字节流计算的内容寻址标识,不是要求读取方自行按照未知内容生成对应哈希。- 整个机制的设计定位是写入方持有数据所有权,通过传递BlobHandle实体给读取方完成授权访问,不存在需要读取方提前知晓业务内容、自行匹配生成BlobHandle的场景。
标准跨应用共享流程
写入侧操作
- 准备待写入的实际业务数据,将其转为字节数组后计算SHA-256哈希值——这是系统强制校验项:如果你传入的SHA-256和实际写入的内容哈希不匹配,提交session时会直接抛出
SecurityException,也就是你之前测试场景2写入失败的根本原因。 - 基于上述真实内容哈希,搭配自定义的可读label(如"跨应用配置信息")、过期时间(填0为永久有效)、业务自定义tag,调用
BlobHandle.createWithSha256()生成完整的BlobHandle实体。 - 用生成的BlobHandle创建写入会话,通过会话输出流写入全部业务数据,按需设置访问权限(全量开放或指定应用包名授权),提交会话完成数据存储。
- 会话提交成功后,你作为写入方已经持有完全可用的BlobHandle实体——该实体实现了
Parcelable接口,可以通过Intent、跨进程Binder调用、广播等常规跨应用通信通道,传递给需要访问数据的其他应用。
读取侧操作
其他应用拿到写入方传递过来的BlobHandle对象后,完全不需要知晓这个Blob对应的实际业务内容,也不需要知道SHA-256哈希的具体值,直接将BlobHandle传入blobStoreManager.openBlob()即可获取输入流读取数据。
常见疑问澄清
- 不存在“不知晓目标数据内容就能生成匹配BlobHandle”的必要:BlobHandle本质是写入方出具的访问凭证,读取方只需接收并使用这个凭证即可,不需要自行生成。
- 如果你需要实现传统的“自定义固定key寻址”逻辑,只需要自行维护一层key到BlobHandle的映射即可:写入完成后,把自定义key和对应的BlobHandle实体,序列化存储到公共存储下固定路径的小体积轻量文件中,读取方先读取这个映射文件拿到对应key的BlobHandle,再去打开目标Blob,整个过程完全不需要提前知道业务数据内容。
- 系统强制要求写入时传入和实际内容匹配的SHA-256,核心作用是防篡改:如果提交过程中实际写入的内容和预声明的哈希不匹配,系统会直接拒绝提交,从机制上避免共享Blob被恶意替换为其他内容。
现有代码的优化点
- 读取文件时使用
pfd.available()判断流长度是不可靠的:大文件场景下该方法会返回错误值,正确做法是循环读取直到流到达EOF,或参考写入时的实际数据长度设置缓冲区。 - 读取逻辑中重复调用
createBlobHandle()属于无意义计算,应将生成的BlobHandle实体缓存复用。 - 非公开敏感数据不要调用
session.allowPublicAccess(),应改用session.addAllowedPackage(目标包名, 对应签名哈希)做定向授权,避免数据被任意应用读取。
内容的提问来源于stack exchange,提问作者Thomas Thomas
相关产品推荐
相关产品推荐

