隐私与数据边界

Android 本地 AI 的 HTML 文档文本投影与输入边界

定义用户选取 HTML 文件到本地任务的静态文本投影、资源边界、base URI 和内容纳入规则;不同于模型输出消毒、XML DTD 及 EML MIME 解码。

审核状态: 内容已校验;中文稿供用户审核 · 2026-10-08 · Fact IDs: ANDROID-HTML-DOCUMENT-EXTRACTION-2026-10, RAG-01, ANDROID-PRIVACY-01

直接回答

把用户选择的 HTML 文件当作不可信来源数据,而不是要打开的网页。Parser 可以构造节点树,但不会自动复现浏览器布局、CSS、JavaScript、无障碍行为或文章语义。先定义产品究竟需要文档文字、文章式子集、链接标签、表格单元格、图片替代文本,还是其他命名投影。Parser 返回 Document 并不能判断哪些内容相关、用户可见,或适合放入模型 prompt。原始字节、解码文本、DOM、投影和模型输入应是不同阶段且分别记录结果。 在抽取前定义字节到字符的策略。通过用户选择的 provider stream 读取,明确支持的 charset;用准确 parser API 测试 BOM、meta charset 声明、缺省编码、冲突标签、非法字节和读取错误。不能假设所有文件都是 UTF-8,也不能静默替换非法序列后仍称为精确原文。记录声明/推断出的编码与回退决策。保留原始文档和稳定来源标识,使用户可对照实际选择的文件。 明确选择 parser 并使用读取已提供数据的入口。WHATWG HTML Standard 说明 DOMParser 的 parseFromString 不执行 script,但不会消毒危险节点或属性。该浏览器接口不是 Android 平台导入 API,脚本不执行也不证明资源处理器未发请求。jsoup 应固定 parse(String, baseUri) 或 parse(InputStream, charset, baseUri) 的准确重载。connect(url) 创建 Connection,执行 get、post 或 execute 才抓取;parse(URL, timeoutMillis) 重载也会抓取 URL,所以仅凭 parse 方法名不能推断离线。固定实际版本和准确入口后测试。 Base URI 是解析相对引用的元数据,不是打开引用的权限。用户选取的 content URI grant 按 picker/provider 合同授权读取所选来源;HTML base URL 不会扩大该授权,也不会授权抓取图片、frame、stylesheet、script 或链接。将原始来源 locator 与 parser base URI 分开保存。若预览保留相对链接,应以惰性引用存储;解析或打开链接需另一项明确功能和用户选择。若 parser 意外调用网络或资源 resolver,测试必须失败。 定义文本投影,不要在没有渲染引擎时声称抽取“可见文字”。一种 profile 可以按文档顺序遍历 body 标题、段落、列表项、表格 caption/cell 和 anchor 标签。默认可排除 head、nav/sidebar 页面导航、script、style、template、表单控件值,以及带 hidden 或 aria-hidden=true 的节点;header/footer/aside 既可能是导航也可能是作者正文,必须明示纳入规则。图片 alt 可作为独立标记字段,不要悄悄混进正文。静态 parser 通常无法判断计算后的 CSS 可见性或读屏器宣读内容;应将这些情况记为未知,不能假装结果等于浏览器截图或无障碍树。 阻止用户内容跑出所需阶段。不要把选中的本地文件加载到 WebView 作为抽取捷径,也不要把解析的 markup 拼进新 HTML 页面。若 WebView 加载不可信内容,文件访问和脚本设置可能暴露应用可读文件。将批准的投影按纯文本显示,或使用另行审查的 renderer;链接目标作为引用保留,不执行 script、event handler、form、meta refresh 或 embedded object。静态文字抽取并不需要外部资源,默认不应抓取。 在流和节点树两层限制工作量,但必须说明限制何时生效。缓冲/解析前先执行真实的字节或 decoder 上限。若节点数或深度只能在完整树构建后检查,它只是解析后的验收门槛:可以拒绝过大的树,却不能保证树分配已受限。只有所选 parser 明确提供并记录的原生预分配控制才可称为解析前限制;否则应隔离解析并说明限制。收到取消通知不代表阻塞中的 parse 已停止。为每次选择分配 owner/revision token,在同一串行或原子事件路径中应用结果时再次检查;只有 parser 实际退出后才能关闭输入流或删除派生副本。来源文件保持不可变。宽容型 parser 可能修复畸形 markup;记录恢复并把结论限定在 parser/version,不声称等同浏览器。 用带来源 hash 且预期投影独立准备的合成语料测试:畸形但可恢复 markup、UTF-8 BOM、另一种支持字符集、冲突编码信号、script/style/template、hidden 属性、aria-hidden 节点、含秘密样式值的 form、表格、带外部 href 的链接标签、图片 alt、base 元素、嵌套列表、注释和超大文件。围绕 parser 安装网络/资源钩子;将准确 parse API 与 connect/fetch API 分开测。分别比较纳入文本、顺序、空白归一化、遗漏项和链接引用。本文不声称 Cove 支持 HTML 导入,也不声称静态投影等同浏览器显示内容。

本地报告含隐藏 token 和外部图片链接

用户选择一个 HTML 导出,里面有报告表格、带先前输入 access token 的 form、script、aria-hidden 注释、相对 base 元素和远端图片 URL。团队需要本地总结,但不能意外打开浏览器或把私人表单状态混进去。

决策

用固定 parser 和字符集解析,按声明的 body 文本 profile 排除 form/隐藏内容,将链接保持为引用而不抓取,并在处理前展示准确投影。

预期结果

本地任务仅消费用户复核过的投影;源文件未变,排除项未被带入,也不宣称覆盖完整浏览器可见或可访问内容。

需要收集的证据

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

  • ANDROID-HTML-DOCUMENT-EXTRACTION-2026-10:专用事实卡记录 parse-only HTML 来源、字符集与文本投影策略;不声称 Android 内置 HTML 导入 API 或 Cove 功能。
  • RAG-01:本地 AI 数据流各阶段需独立验证;该事实不定义 HTML parser 行为。
  • ANDROID-PRIVACY-01:用户选取文件的访问、保存及下游用途属于应用责任。

隐私声明需要数据清单和流量证据;“本地模型”标签本身不是证明。

实施流程

  1. 选择并标识来源文件. 使用用户选择的文档 URI,保留返回的访问授权和来源版本,并在明确大小限制下流式读字节。不得替换成原始路径,也不要为抽取而在 WebView 打开文件。
  2. 固定 charset 和 parser 版本. 写明字符集信号和冲突处理,再固定 String/InputStream parse 的准确重载与 parser artifact/version。排除会抓取的 parse(URL, timeoutMillis) 和 Connection 执行;connect(url) 仅创建对象,执行后才联网。
  3. 定义投影纳入策略. 明确纳入的 body 结构、标题/列表/表格顺序、anchor 标签、可选图片 alt,以及排除的 script/style/template/form/hidden 标记。声明不推断 CSS 可见性或读屏树。
  4. 让引用保持惰性并限制工作. 将 base URI 和 href 仅作为数据保存,不触发抓取。解析前执行字节/decoder 上限。若深度/节点只能在建树后检查,就标为解析后拒绝;除非所选 parser 明确提供更早的控制。无法限制预分配时隔离解析。
  5. 复核并测试派生文本. 模型输入前展示归一化投影和遗漏项。测试畸形、编码、hidden/form、表格、base/相对链接、网络 canary、超大输入和取消。取消信号本身不会停止阻塞 parser:在同一串行或原子路径用当前 owner/revision 守卫结果应用;parser 实际退出后才关闭输入流,且来源文件保持不变。

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

验收标准

  • 用户选择的来源 URI/grant、原始字节、解码文本、parser tree 和派生投影保持分离且可追溯。
  • 字符集冲突和非法字节有明确结果;parser/version 与宽容恢复行为被记录。
  • 纳入/排除策略覆盖 body 结构、隐藏/form/script/style 内容、链接、alt text 和未知 CSS/无障碍可见性。
  • Base URI 与 href 不授予权限、不触发抓取;仅运行 parse-only API,并通过网络/资源 canary 验证。字节/decoder 上限在解析前生效;仅在建树后才能检查的节点/深度规则须标为解析后验收,除非所选 parser 有明确的解析前控制。
  • 不使用 WebView 快捷抽取,不声称完整浏览器可见、无障碍等价或 Cove 已支持。

决策对照表

维度选择或证据解读方式
HTML parse-only 文本投影在内存解析用户选择来源,并按命名结构规则选取文字。产生派生文本但不执行浏览器布局;profile 不会自动识别所有可见或相关内容。
WebView 渲染不要用于抽取不可信本地 HTML。会在浏览器组件中加载内容,文件访问、脚本和资源设置形成另一安全边界。
XML DTD 导入为准确 XML parser 配置声明/entity 策略与限制。XML parser 控制不能定义 HTML 树构造或畸形 HTML 恢复。
EML 中的 HTML MIME alternative先选取并解码 MIME part,再调用独立 HTML 投影策略。MIME transfer encoding/charset 决定源字节,但不决定 HTML 文本纳入范围。

需要避免的失败模式

  • 将静态 DOM 文本说成完整的浏览器可见文本或无障碍树。
  • 把 DOMParser 的 script 不执行扩大成没有外部资源请求或已完成消毒。
  • 把 base URI 当作 provider URI 授权,或让相对链接自动联网。
  • 把选中的本地 HTML 直接加载到 WebView 来提取文字。

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

最小复现记录

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

发布检查表

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

来源与相关证据

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

常见问题

DOMParser 解析时脚本不运行,所以 HTML 是否安全?

不是。HTML Standard 说明解析出来的 script 不会执行,但 parseFromString 不会清除危险节点/属性;该浏览器 API 也不能证明 Android resource handler 的行为。

Base URI 会授权抓取相对图片或链接吗?

不会。它只是解析引用的元数据,不是权限。相对链接应保持惰性;除非另有功能和用户选择授权,否则不抓取资源。

解析后的节点上限能限制 parser 内存吗?

不能。若只能在建树后取得节点数,该门槛只能拒绝结果,不能限制已经发生的分配。解析前限制字节/decoder,并使用文档明确支持的 parser 原生前置控制;否则隔离解析并说明限制。

收到取消就表示阻塞解析已停止吗?

不表示。只有当选择 owner/revision 仍为当前值时才可在同一串行或原子路径应用结果;parser 实际退出后再关闭流或删除派生数据,绝不修改来源。

静态 parser 能判断浏览器实际显示了哪些文字吗?

通常不能。CSS 布局、脚本、viewport 和无障碍行为都会影响可见或宣读内容。应写明投影规则,将依赖渲染的事实标为未知。

任何 jsoup.parse 重载都只解析已提供数据吗?

不是。String/InputStream 重载解析已提供数据,但 parse(URL, timeoutMillis) 会抓取 URL。connect(url) 创建 Connection,其 get、post 或 execute 执行时才抓取。应固定准确重载、输入流来源和资源边界,不能仅相信方法名。