直接回答
Android AI 应用的权限审计应把每项能力连接到需要它的具体功能、请求时机、拒绝后的行为,以及用户之后更改访问权时的处理方式。“使用本地模型”不是一种 Android 权限,也不会消除应用对摄像头、麦克风、文件、通知或网络访问的责任。`ANDROID-PRIVACY-01` 与 `PRIVACY-01` 说明了两件事:推理在哪里执行和应用怎样访问、保存、发送数据是不同问题。审计要一起查看 Manifest、运行时权限请求、内容提供器授权、系统设置入口和网络/服务路径。 先建立清单,不要复制另一种产品的权限列表。对每个权限或 URI 授权,记录用户可见功能、确切操作、最小可用范围,以及它是否真的必需。例如拍照功能可以在用户打开相机时请求摄像头权限;从系统文件选择器导入图像则可能走另一条授权路径。录音和语音识别、播放、转录并非同一项操作。Manifest 中出现某权限不能说明数据被上传;没有某权限也不能证明内容一定留在本地。这些判断需要检查实际代码路径和请求目的地。 在功能需要时再请求,并用用户听得懂的话解释眼前目的。用户拒绝后,如果存在替代方式,应保留可用路径,例如不能拍照时仍可选择已有图片。不要在拒绝后反复弹窗,也不要让无关功能一起被锁定。Android 支持一次性或有限访问的场景时,要测试授权过期、Activity 离开前台、进程重建以及用户在系统设置中撤销后的行为。把内容 URI 看作有所有者和生命周期的访问能力,不要为了省事把单项选择扩大成全盘存储访问。 权限状态不是安装时决定一次就永远不变。执行敏感操作前应确认所需访问仍然存在;把 SecurityException 与提供器失败作为正常状态转移处理,取消依赖该资源的任务,关闭文件描述符和媒体资源,并向用户说明如何重试。如果摄像头访问在拍摄、预处理、推理、保存或导出中被撤销,先决定已复制的数据是否允许完成处理,还是必须停止。不能继续读取用户已撤销的资源,也不能在没有保留依据时悄悄留下派生结果。但撤销源文件权限并不自动擦除应用先前复制到私有目录的文件;那属于另外一项删除策略。 在产品实际支持的 Android 版本和目标 SDK 范围内测试完整矩阵,不要把一次本地测试外推成所有设备兼容结论。覆盖首次安装、允许、拒绝、再次拒绝、相关的一次性授权、设置中撤销、后台切换、进程重建和重新进入功能。核对界面状态、资源清理、重试入口和是否展示过期输出。最后独立检查网络行为:Network Inspector 对部分请求库有用,但权限结果和空抓包都无法替代代码及依赖审阅。 功能删除后也要清除不再需要的权限声明,并检查依赖合并后的 Manifest。界面解释、隐私披露和实际行为必须一致。审计结果应是一份“能力—权限—数据路径”映射表和可复现测试,而不是“权限少所以隐私好”的结论。更窄权限范围可以减少应用访问机会,但只有源代码和行为测试才能说明应用如何处理它已经能够访问的数据。
图像功能既支持拍摄也支持导入
团队同时支持拍新照片和选择已有图片进行本地分析。当前实现一打开应用就请求摄像头权限,也没有定义分析中途权限被撤销时的处理方式。
决策
将相机权限和系统选择器授予的文件访问分开,在对应用户动作发生时请求,并定义撤销后的取消与清理。
预期结果
审核者能看出每项访问能力存在的理由,也可以测试拒绝、撤销和替代输入路径,不会从权限清单推断网络行为。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- ANDROID-PRIVACY-01:Android 应用负责权限与数据控制
- PRIVACY-01:推理位置不证明其他请求不存在
隐私声明需要数据清单和流量证据;“本地模型”标签本身不是证明。
实施流程
- 盘点声明权限和实际访问. 检查应用 Manifest、依赖合并 Manifest、运行时请求、系统选择器、持久 URI 授权和设置跳转。为每项记录用户动作、数据对象、操作、范围和资源所有者。
- 缩小范围并把请求放回场景. 删除未使用声明。用户进入需要访问的功能时再解释并请求,能使用系统选择器时优先使用其有限授权,避免以方便为由扩大到整个文件系统。
- 定义拒绝和授权过期行为. 分别写清首次拒绝、再次拒绝、一次性授权结束、设置中撤销和提供器错误时,功能是不可用、可选择其他输入,还是在重新授权后可继续。
- 在各个敏感阶段注入撤销. 在采集、预处理、推理、保存、导出阶段模拟访问撤销。按需要取消任务、关闭描述符和图像/音频资源,并展示哪些结果已经真正提交。
- 单独审计数据流. 独立检查本地存储、备份、诊断和请求目的地。捕获支持的网络流量并检查依赖,同时记录抓包工具无法覆盖的路径。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 每项权限或 URI 授权都对应具体功能和操作;未使用的 Manifest 声明已删除或有明确理由。
- 拒绝、临时授权结束、设置撤销和任务中撤销都产生确定的用户状态,并关闭由应用拥有的资源。
- 隐私说明把访问权限与上传、保留、备份和删除分别表述,后几项结论各有独立证据。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 拍照 | 用户启动拍摄时请求摄像头 | 只说明拍摄路径所需权限,本身不说明后续存储或网络行为。 |
| 选择已有图片 | 系统选择器或限定 URI 授权 | 访问与所选项目和授权生命周期绑定,仍需验证提供器行为。 |
| 广泛存储权限 | 应用级文件系统访问 | 范围远大于单项选择,不能替代明确的数据流设计。 |
需要避免的失败模式
- 启动时一次性索取所有权限
- 把文件选择权限等同于广泛存储权限
- 把权限撤销说成自动删除应用副本
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
权限更少能证明 AI 应用在本地处理吗?
不能。权限说明应用可以访问什么能力。网络客户端、SDK、系统备份、导出和诊断路径仍需独立检查与测试,并分别记录可复核证据。
应用一打开就应该申请摄像头权限吗?
应在用户启动需要拍摄的功能时请求,并解释当前用途;若功能支持选择已有图像,应保留合适的非摄像头路径,不要锁住无关功能。
撤销权限会删除应用已经复制的数据吗?
未必。撤销改变受保护资源的访问权;应用私有副本和派生结果适用独立的保留和删除规则,需要明确说明并进行重开验证。