直接回答
有用的本地 AI 崩溃报告应记录执行边界,而不是用户私人内容。可以记录应用构建、系统版本、运行时和制品标识、任务阶段、后端请求、取消状态、异常类别以及经过审查的资源元数据。不要未经评估就记录提示词、转写、图中文字、凭据、签名 URL、数据库行、模型响应或任意异常文本。Android 安全指导建议避免敏感 Logcat,并在生产日志中做净化。“模型在设备上运行”并不意味着诊断上传或共享日志也留在本地。 设计一个字段白名单诊断结构。用户内容优先记录长度、内容类型或稳定的合成样例标识,不要直接存内容。文件路径要清除用户名、内容 URI、令牌和查询参数。异常可保留类名和经过核验的错误码;堆栈可能包含本地路径、SQL 片段、输入值或模型路径,因此要在导出前判断哪些部分安全。若剩余字符串仍能识别人物或秘密,简单遮掉一段内容并不够。 开发诊断和生产遥测要分开。开发版可以开详细本地日志;生产日志应避免私人变量,尽量使用编译期常量或枚举类别。如果使用远程崩溃服务,要审核它自动捕获的内容、自定义键与面包屑、目的地以及保留期限。本地推理和崩溃报告是两条独立数据流。 分享诊断包前给用户预览,展示包含的类别,允许移除可选元数据,默认不加原始提示词或媒体。提供取消路径,并在发送或保存结束后清理临时导出文件。如果离线时无法发送,说明报告不会上传,直到用户主动操作;不能暗中排队,之后再传输私人诊断。 用合成敏感值测试脱敏:人名、类似电话和邮箱的字符串、复制内容、提示词、文件 URI、类似令牌的内容以及包含输入文本的异常消息。不要使用真实用户记录。分别检查 Logcat、保存的报告、分析事件和支持导出。只对最终压缩包做一次脱敏,不能证明早先日志和面包屑里没有数据。 报告仍应支持诊断:保留事件顺序、应用版本、模型修订、运行时版本、阶段变化、重试次数和是否发生回退。字段被省略时标记为不可用,不要从私人内容中反推。为报告结构记录 schema 版本。完整审核时先枚举 AI 任务接触的日志、崩溃 SDK、面包屑和导出路径;将字段划为必需、可选、敏感或禁止;用合成样例测试失败、超时、取消、加载错误和解析错误;分别检查每个输出面;最后说明报告留在本地、由用户分享还是可能上传,并让隐私说明与行为一致。合格报告能说明故障发生在哪个阶段,同时不携带导致故障的用户内容。
转写解析器遇到私人会议文字后崩溃
开发者需要定位端侧转写后的异常。默认日志语句包含原始响应,自动崩溃服务也可能把面包屑附加到远程报告。
决策
用白名单事件记录替代原文日志,并用合成文字检查本地和远程每个诊断面,再启用报告流程。
预期结果
团队保留故障阶段、版本和错误类别,同时避免泄露原始转写或提示词。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- 日志、崩溃 SDK 与导出路径清单
- 允许字段和敏感字段定义
- 合成敏感数据的脱敏测试
隐私声明需要数据清单和流量证据;“本地模型”标签本身不是证明。
实施流程
- 映射诊断数据路径. 列出 Logcat 调用、崩溃 SDK 附件、自定义键、分析、面包屑、本地调试文件和用户生成支持包,并标注目的地、触发条件、保留时间和默认包含内容。
- 定义字段白名单. 保留构建、系统、运行时、模型修订、阶段、事件顺序和核验后的错误类别。排除提示词、转写、模型输出、图像内容、凭据、用户路径、签名 URL 和未审查异常文本。
- 端到端运行脱敏样例. 注入合成姓名、邮箱形式、提示词、URI、令牌和异常消息,并分别检查 Logcat、面包屑、导出包和远程报告。测试需覆盖打包后的生产路径。
- 让分享由用户决定. 分享前预览可选诊断,允许取消,说明临时文件清理和网络行为。不要静默排队等待稍后上传私人报告。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- AI 日志包含足以复现阶段和版本的元数据,默认不包含原始用户内容。
- 合成敏感样例在所有检查过的日志、面包屑、导出和远程报告中均不存在。
- 任何外部诊断传输对用户可见、可控,且隐私文案说明准确。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 记录原始提示和输出 | 无过滤的详细跟踪 | 可能暴露用户内容和秘密,生产环境应避免。 |
| 允许字段事件元数据 | 阶段、版本、错误码和顺序 | 通常足以定位问题,同时减少敏感数据。 |
| 用户预览的支持包 | 可检查的可选导出 | 用户控制分享内容和目的地后可补充必要上下文。 |
需要避免的失败模式
- 把提示词写入 Logcat
- 只在最终压缩包脱敏
- 认为本地推理代表崩溃上报也是本地
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android privacy and security
- Android Developers — 日志信息泄露
- Android Developers — 隐私与安全概览
- Android Developers — 安全存储最佳实践
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
Logcat 留在手机上,所以是私密的吗?
不能这样假设。Android 安全指导建议避免敏感 Logcat 内容;调试工具、特权组件、导出或崩溃 SDK 都可能扩大访问。只记录核验过的非敏感元数据。
可以只记录提示词哈希吗?
哈希仍可能被关联,短且可猜测的文字也可能被穷举。若足够,优先使用合成样例 ID 或粗略长度/类别,并说明任何可能关联会话的标识。
本地推理是否意味着崩溃上报也在本地?
不意味着。推理和诊断是不同数据流。描述崩溃报告前应检查 SDK 默认附件、面包屑、自定义字段、目的地、用户同意和保留期限。