模型交付

排查 Android 本地 AI 模型文件权限错误

无法读取模型文件时,应先确定文件归谁所有,以及权限由哪个存储机制授予。应用目录文件、可移除卷和用户选择 URI 的权限范围与生命周期不同;不能将访问失败直接称为文件损坏。

审核状态: 内容已校验;中文稿供用户审核 · 2026-10-05 · Fact IDs: ANDROID-PRIVACY-01, COVE-MODEL-02

直接回答

Android 应用无法读取本地模型时,先确定目标文件属于哪种存储边界,以及权限是通过什么机制授予的。应用内部或应用专属外部目录中的文件由应用生命周期和沙箱管理;用户选择的文档通常通过带有授权的 content URI 访问,该授权可能是临时的、被撤销或受 Provider 限制。记住一个绝对路径并不能证明文件仍在,也不能证明应用有权读取。重试之前应分别检查所有权、URI、授权、存储卷和打开结果。 不要通过为所有错误申请宽泛存储权限来“修复”。Android Storage Access Framework 允许用户选择文档并仅授予对该项目的访问权。应用应使用 ContentResolver 处理返回的 URI,而不是从 URI 字符串拼出文件路径。如果业务要求进程重建后仍能访问,要确认选择器是否返回可持久化授权,并且只有产品流程确实需要时才保存该授权。持久授权也可能被用户撤销,云文档 Provider 也可能暂时不可用。这些应被表达为当前无法访问,不应推断文件内容已损坏。 文件访问错误与内容校验必须分开。Provider 可能在应用读到任何字节之前就拒绝或撤销授权;这与成功读取后发现 MIME 类型通用、文件内容无效或模型格式不支持是不同故障。权限问题应提示用户重新选择或恢复访问;解析或摘要错误则遵循工件校验政策。不要对持续返回 Permission Denied 的 URI 不停重试,也不能在授权和内容检查完成之前把文件复制到活动模型目录。 对于应用自有文件,应确认路径来自当前应用上下文与存储位置、目录存在且卷已挂载。应用内部专属文件一般对其他应用私有,应用卸载时通常会删除;应用专属外部文件可能有不同的可用性和生命周期。迁移、重装、包变更或可移除卷移除后保留的旧路径可能已经失效。要查询当前存储状态,并从当前配置重新计算期望路径,不要假设过去保存的绝对字符串仍然有效。 报错时说明观察到的事实和用户可以做什么。对于授权撤销,可以提示“应用已无法访问所选文档,请重新选择”;如果应用根本没有读取到字节,就不能说“模型已损坏”。如果应用自有文件不存在,应说明模型需要通过已经验证的产品路径恢复(若存在),不可虚构下载入口。如果来源或当前模型身份未知,应提示重新选择或使用有文档的模型管理动作,同时保护原有活动模型和用户数据。 日志只保存安全诊断:应用构建、模型配置身份、存储类别、符合政策时脱敏的 URI 域名、授权状态、卷状态、生命周期阶段和错误类别。不要把含身份信息或访问令牌的完整 URI、文件内容、提示词、账户信息或原始堆栈写入对用户可见的支持包。还应记录权限是在打开前缺失、使用时被撤销,还是成功打开后才发生 I/O 错误;这些状态对应不同恢复路径。

用户撤销了已选文档授权

用户通过系统文件选择器选中模型,随后在设置里撤销访问。应用仍缓存旧 URI,但再次打开时在读取任何模型字节前就失败。

决策

识别 URI 授权失效,提示用户重新选择或使用已支持来源,并保持活动模型不变。

预期结果

应用明确报告访问问题而非文件损坏,也不会索取访问无关文件的广泛权限。

需要收集的证据

只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:

  • 事实卡 ANDROID-PRIVACY-01、COVE-MODEL-02;Android 权限与模型身份事实。
  • Android Storage Access Framework、ContentResolver 和应用专属存储文档。

收到完整字节流还不够;最终落盘、完整性、运行时加载和恢复路径也必须验证。

实施流程

  1. 确认文件归属. 判断目标是应用内部、应用专属外部、可移除卷还是用户选择的文档 URI,并记录每种位置的所有权和生命周期区别。
  2. 读取前核对授权. 应用文件路径根据当前上下文重新生成并检查目录/卷;URI 文件先确认系统授权并通过 Resolver 打开,不从 URI 猜测磁盘路径。
  3. 处理授权撤回. 只有选取结果允许且产品需要时才保存持久访问权。授权过期或撤销后提供重新选择,不通过请求全盘文件权限绕过。
  4. 把访问和内容校验分开. 字节尚未打开时只报告访问错误;成功读取候选内容之后才运行格式、长度、可信摘要和运行时校验。
  5. 保持活动工件. 候选文件在独立位置读取并校验,只有必要检查通过后才能切换。单纯授权错误不能删除原模型或任何用户数据。
  6. 验证拒绝与卷状态. 测试选择器取消、临时权过期、持久授权撤销、云端提供器离线、卷移除、更新后旧路径失效及重新选择成功。

让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。

验收标准

  • 错误说明观察到的存储边界和访问结果,未读到字节前不声称工件损坏。
  • 用户选择文档通过获授权 URI 访问,不猜路径也不申请无关的广泛文件权限。
  • 授权失效时提供重选或文档化恢复路径,并保持原活动模型可用。
  • 支持诊断会隐藏 URI 凭据、文件内容、提示词、账户信息和私有模型数据。

决策对照表

维度选择或证据解读方式
URI 授权撤销应用无法重新打开此前选择的文件。请求重新选择或恢复产品支持的访问。
应用路径缺失预期文件不存在或存储卷不可用。检查当前应用存储/卷并通过已验证渠道恢复。
内容校验失败字节可读但格式、身份或摘要未通过。拒绝候选并遵循工件修复策略。

需要避免的失败模式

  • 不得为所有读取错误申请全盘访问,也不得把内容 URI 猜成文件系统路径。
  • 未能读取字节之前,不得称模型文件格式错误或摘要不匹配。

还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。

最小复现记录

层级记录内容
设备厂商、型号、芯片、内存档位、操作系统版本
软件应用版本和 Git 提交号
模型系列、变体、版本、格式、文件长度、摘要、量化方式
运行时名称、版本、请求后端及实际后端证据
工作负载样例版本、输入摘要、提示词摘要、输出策略
结果完成、失败、取消、回退及保护隐私的诊断信息

发布检查表

  • ☐ 主要搜索问题已回答,且没有未经支持的数字。
  • ☐ 所有模型文件和运行时版本均已固定。
  • ☐ 代表性任务和失败处理策略均有说明。
  • ☐ 生命周期、取消、清理和回退均已测试。
  • ☐ 用户内容与网络边界均有说明。
  • ☐ 结论只适用于被记录的配置。
  • ☐ 新增测试结果时链接到原始方法或证据。

来源与相关证据

中文部署与排错专题见。奇连 AI 端侧专题。

常见问题

文档 URI 失败时是否应申请所有文件访问?

通常不需要。先检查系统授权并使用文档选择流程。宽泛权限会暴露无关文件,也不能恢复已经撤销或过期的 URI 授权,应让用户主动重新选择。

权限拒绝能证明模型文件损坏吗?

不能。应用未成功读取字节就不知道内容是什么。应说明当前访问受阻,让用户重新选择,然后再执行格式和完整性检查,不要猜测文件内容。

保存下来的文档 URI 是否会永久有效?

不会。授权可能临时、被撤销或因内容提供器离线而不可用。应重新检查授权状态,提供重选或服务恢复方式,而非永久信任旧 URI。