直接回答
入站 ACTION_VIEW 是外部导航请求,不是授权令牌。任何应用都可能尝试用定制 URI 数据启动已导出的 activity;多个应用也可能注册同一自定义 URI scheme。intent filter 只描述哪些 Intent 可以抵达组件,并不能证明发送者是谁、参数是否安全或当前用户是否批准某项模型操作。即使通过看似熟悉的链接打开,也应将 action、URI、extras 和 referrer 视为不可信输入。 添加 intent filter 前先定义小而明确的路由语法。逐条写清接受的 scheme、authority 与 host、port 策略、path 形状、query 名称和值类型、重复参数处理以及允许的 extras。用 Android Uri API 解析后,按结构化字段匹配该规则;不要在整个 URL 上搜索可信 host 子串。路由匹配应尽量窄;scheme/host 组合不能混并时应使用分开的 filter。对损坏编码、未知 action、不期望字段和有歧义的形式直接拒绝,不要猜目标位置。 解码与规范化必须符合该路由器的精确定义。明确哪些组件由 API 何时解码,并只校验一次规范化结果。不要反复 percent-decode,也不要把通用正则当作 URI parser;编码分隔符、重复 query、大小写、空 port、fragment 及类似路径穿越的片段都应有专门用例。可以保留安全的展示值供用户复核,但不能把攻击者控制的原文当可信标记内容展示或记录。如果路由带记录 ID,只能把它当查询键,查出记录后还要验证当前帐号/档案有权访问。 Android App Links 在 HTTP(S) 网站域名和应用之间建立已验证关联,可降低其他应用自动冒领该网站链接的风险;它不证明每条路径或 query 值无害、不识别点击者,也不授权私密操作。自定义 scheme 没有这种域名关联,并可能与其他应用冲突。从 Android 12(API 31)起,通用 web Intent 只有在应用获准处理该特定域名时才会路由给应用;不同 scheme 和系统版本上的普通深链行为也有差异。应测试实际 manifest filter 和安装应用的解析结果,而不是假设 URL 必然抵达预期 activity。 路由通过校验后,再独立检查应用状态。解析当前登录帐号或档案,确认引用对象存在且属于该身份,并使用与应用内导航相同的访问规则。link 参数、calling package、referrer 或 Intent extra 不能替代认证会话。深链可以打开复核页面或填入无害草稿;对私密内容运行推理、下载模型、分享数据、付款或删除,仍需用户单独操作。不要让打开链接悄悄跨过这些边界。 content URI 的处理要与 URL 路由分开。链接里包含 `content://` 文本本身不会授予读取权限;访问取决于发送方实际授予的 Intent flags/URI grant,或用户重新选择文件。不要扩大 grant、无需求地持久保存授权,或把不透明 URI 转成路径。若链接启动外部流程并返回另一个 Intent,应按接收契约再次校验返回数据。对首次 `onCreate` 与后续 `onNewIntent` 都重新执行路由和状态检查;不能因为复用 activity 就跳过校验。 使用对抗路由夹具:scheme/host 错误、相似 host、意外 port、多余 path、编码斜线或点片段、重复 query、空值与超长值、损坏百分号编码、未知 extras、会话缺失、其他档案的记录、过期 ID、无 URI grant,以及 onNewIntent 重复投递。验证安全回退导航,且用户确认前不会泄露受保护内容或产生副作用。记录 Android 版本、manifest 路由、解析到的 activity、规范化路由结果、授权状态类别和夹具 ID,不保留私密内容。本文是通用 Android 方法,不声称 Cove 当前提供深链。
链接请求打开一个已保存的本地模型结果
消息应用通过 ACTION_VIEW 启动已导出的 Android activity,URI 中含记录 ID 和操作参数。链接可能由其他应用传入,当前档案刚切换,且系统中还有另一个应用注册了相似自定义 scheme。
决策
将路由视为不可信,校验结构化组件,按当前帐号解析记录,并显示复核页,而非执行链接请求的操作。
预期结果
只展示当前用户有权访问的记录;任何模型处理或分享仍需单独、可见的用户确认。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- ANDROID-DEEP-LINK-ENTRY-2026-10:入站 Intent 数据是外部入口,不是调用者身份、授权或用户确认的证明。
- ANDROID-PRIVACY-01:应用仍负责数据访问与用户控制。
- Android 深链安全与 App Links 文档定义入站校验、域名关联和系统版本行为。
隐私声明需要数据清单和流量证据;“本地模型”标签本身不是证明。
实施流程
- 尽量减少外部入口. 只导出确需接收外部请求的 activity。声明准确的 scheme、host、path;自有域名优先使用已验证 Android App Links,但自定义 scheme 仍按可能冲突处理。
- 按单一路由 schema 解析. 分别读取 action 与 Uri 组件。校验 scheme、authority、host、port、path、query 键、重复项、类型、长度和允许的 extras;为路由明确一次性规范化与解码规则。
- 重新校验身份和访问权. 解析当前帐号/档案,并通过应用内导航使用的相同授权路径查找引用数据。referrer、calling package、extras 或已验证域名都不是用户身份认证。
- 将敏感操作留待用户确认. 先打开安全目的地或复核草稿。对私密数据推理、下载、分享、付款或破坏性更改要求用户明确操作;不能将 action query 参数视为同意。
- 重测所有生命周期入口. 覆盖冷启动 onCreate、复用后的 onNewIntent、系统/链接解析、损坏路由、帐号切换及 URI grant。只记录脱敏后的路由和结果类别。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 每个导出路由都有结构化白名单;损坏、有歧义、超长、重复或未知数据都会安全回退。
- App Links 验证只描述域名与应用关联;路由值和当前用户授权分别校验。
- content:// 访问需要实际 URI grant 或用户重新选择文件,不能从任意链接文本推断授权。
- 打开链接本身不能启动推理、下载、分享、付款、删除或读取其他档案的记录。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 已验证 Android App Link | 为自己控制的网站使用 HTTP(S) 域名与应用关联。 | 降低链接冒领风险;不认证用户,也不校验每个路由值。 |
| 自定义 URI scheme | 只有在理解冲突风险且路由范围明确时使用。 | 其他应用也可能注册相同 scheme;必须校验所有入站组件。 |
| SAF content URI grant | 需要访问文档时使用系统媒介化的用户选择。 | 它是单独的访问机制,不由 ACTION_VIEW 中的 URI 文本自动产生。 |
| 外部操作参数 | 视作打开复核状态的请求。 | 不能替代应用授权,也不能替代用户确认有后果的操作。 |
需要避免的失败模式
- 不要把 intent-filter 命中、已验证域名、referrer 或 Intent extra 当作已认证的用户同意。
- 不要用子串检查解析 URL,也不要重复解码路径直到它匹配某个路由。
- 不要假设深链携带的 URI 字符串具有独立 content URI 的读取授权。
- 不要仅因用户打开链接就触发下载、推理、分享、购买、删除或其他有后果的行为。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android privacy and security
- Android Security:不安全的深链处理风险
- Android Developers:为应用内容创建深链
- Android Developers:Android App Links 与域名验证
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
已验证 App Link 是否意味着 query 参数可信?
不是。验证只建立网站域名与应用的关联,不会认证每个 query 值背后的人或权限。展示私密记录前仍须校验路由数据,并独立检查当前用户是否有权访问。
自定义 scheme 能识别调用方应用吗?
不能。多个应用都能注册同一 scheme,URI 数据不是调用者认证。应始终按不可信输入处理,再校验路由,并要求已认证的应用会话才能访问受保护内容。
入站链接会给其中的 content:// URI 授权吗?
不会自动授权。访问取决于实际 URI grant 与 Intent flags,或用户另行通过文件选择器选择。授权缺失或撤回时应显示输入不可用,而不是改用更宽泛的存储权限。
打开链接后能否自动开始 AI 任务?
不要把打开链接当作同意。先校验并展示请求;处理私密数据或其他重要操作前,要求用户再明确操作。下载、分享、付款和删除还应保留各自的确认步骤。