运行时与集成

Android 本地 AI 原生崩溃符号化与隐私安全诊断

先匹配 tombstone 与原生二进制身份,再用对应未剥离符号分析,并把用户内容排除在常规诊断之外。

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

直接回答

原生崩溃排查需要两类不同材料:发生故障进程的崩溃证据,以及与原生二进制完全匹配的未剥离符号。Android NDK 文档说明可以使用 ndk-stack 符号化原生调用栈,也介绍 Gradle 构建会在对应构建类型和 ABI 的 build 中间目录生成未剥离库。文件名或版本标签相同并不足够;符号不匹配时,函数名和源码位置可能有误导性。应把应用版本、提交或源码版本、ABI、原生库标识和构建变体等身份信息与符号包放在一起,只有身份匹配时才为这条崩溃取用符号。 对端侧 AI 应用而言,原生堆栈应帮助定位运行时或桥接阶段,而不能成为收集用户内容的理由。项目隐私事实说明,本地推理不需要将提示词发送到远程推理服务器,但不能证明应用没有其他网络请求。更重要的是,诊断日志不应包含提示词、转写、图片、生成文本、认证值或暴露个人姓名的绝对路径。崩溃报告与诊断包转移应由明确的产品政策和用户可见说明控制。本地推理并不意味着遥测天然安全或不存在。 在改模型文件或承诺修复之前,先分类故障。区分原生调用周围的 Kotlin/Java 异常、带 tombstone 的进程崩溃、应用无响应事件、运行时加载错误和任务级失败。将原始崩溃材料保存在受控位置,并另做脱敏分析副本。先匹配 ABI 与构建 ID,再用相应未剥离库符号化,然后结合应用阶段码将调用映射到初始化、输入转换、推理、流回调、取消或关闭。不要公开原始转储;即便堆栈也可能泄露路径、用户标识或构建基础设施信息。 测试应在不伪造真实模型故障的前提下验证证据管线。使用受控原生测试夹具或获准的崩溃复现,确认准确符号能解析预期测试帧,也确认身份不匹配的符号包会被拒绝。将发布打包与符号上传/保留作为独立运维测试。真正的模型故障只需附制品/运行时身份和不含隐私的阶段码,不应附提示词。符号化堆栈能缩小停止位置,但单凭它不能证明根因、设备不兼容或性能结论。 符号和原始崩溃数据只应在团队调查需要的期限内开放给必要人员。说明谁可以获取未剥离符号和 tombstone、符号材料如何映射到发布版本、原始转储保留多久,以及脱敏结论如何共享。本文提供的是调试流程,不声称 Cove 当前采集或发布了任何特定崩溃遥测。 构建流程应在制品生成时保存符号,而不是等到用户报告后再临时寻找。符号文件要与对应 ABI、原生库、应用构建和发布标识一起归档;如果采用拆分 ABI 或多个 native library,也需逐个记录对应关系。进行剥离、混淆、链接器或原生依赖升级后,应验证产物身份仍可追溯。诊断运行时,只用匹配材料解释地址;无法匹配时保留原始地址并标记“未符号化”,不要把近似符号结果当成确定结论。 支持流程也需避免过度收集。用户报告可以先提交崩溃类型、发生阶段、应用版本和是否可复现等字段;需要原始文件时再明确解释用途、访问者和保留期限。对外共享的示例应删除用户目录、设备标识和无关堆栈参数。把原始材料限制在少数调查者手中,再分享必要的脱敏帧和修复结论,能把定位效率与数据最小化同时纳入工程流程。

发布构建在原生模型初始化时退出

支持团队收到一个已测试安装中的崩溃报告。报告有应用构建和设备 ABI,但堆栈没有符号。团队附近有一个符号归档,却尚未确认其构建身份是否匹配。

决策

符号化前先按准确原生构建身份匹配崩溃与符号文件;原始材料严格控权,并生成排除用户内容的脱敏分析副本。

预期结果

团队可以定位运行时失败阶段,而不会依据错配堆栈误判根因、设备兼容性,也不会把提示词泄露到常规支持渠道。

需要收集的证据

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

  • PRIVACY-01:本地推理减少向远程推理服务器发送内容的需要,但不能证明应用没有其他网络请求。
  • COVE-LIFECYCLE-01:Cove ModelManager 维护显式模型生命周期状态,可用于区分加载阶段与后续任务故障。

只有记录了模型身份、构建配置、实际后端、任务样例和失败情况,运行时比较才可复核。

实施流程

Record and compare the three evidence pieces together: the app and native build identifiers, the retained symbol files, and the redacted crash fixture. Maintaining all of them in a linked form allows the recorded context to be re-examined against later entries and supports consistent symbolication.

  1. 采集最小且分类清楚的故障记录. 记录应用构建、系统版本、ABI、原生库/构建标识、崩溃类别和应用阶段。安全保存原始 tombstone 或获准的追踪材料;不要增加提示词、转写、媒体、凭据或个人路径字段。
  2. 准确匹配符号归档. 确认构建变体和 ABI,再将原生构建 ID 或其他权威制品身份与未剥离库对照。不匹配的同名归档必须拒绝。符号按发布版本索引,不要只放在会变动的 latest 目录里。
  3. 在受控环境完成符号化. 按照 Android NDK 官方方法使用匹配的未剥离库。先确认已知测试帧能正确解析,保留原始追踪,并区分运行时、应用桥接和系统代码;不能只看栈顶帧就推断根因。
  4. 共享前先脱敏. 删除或掩盖绝对路径、用户名、账号值、本地文档名称和无关进程信息。只共享调查所需的帧、阶段、构建身份和复现细节;原始转储及符号限制访问。
  5. 测试保留流程与错配拒绝. 用受控夹具确认正确符号可以解析,错误构建符号会被拒绝或明确告警。检查发布打包是否按政策留存所需符号,记录资料负责人,并在原生依赖或 ABI 变化后重新验证。

验收标准

  • 每次符号化前均核对 ABI 与准确原生构建身份。
  • 原始崩溃文件和未剥离符号有明确的访问与保留边界;共享结论已脱敏。
  • 报告区分崩溃类别、执行阶段和已证明根因,不夸大为兼容或性能结论。
  • 诊断结构排除提示词、转写、图片、生成文本、凭据和不必要私有路径。

决策对照表

维度选择或证据解读方式
未符号化 tombstone包含地址和元数据的原始崩溃证据应作为源材料保留;通常不足以直接形成可维护的调用点诊断。
匹配后的符号化堆栈崩溃材料加准确构建/ABI 符号可映射地址到函数及可能的源码位置,仍需结合上下文分析。
附带用户内容日志不应作为默认支持包通常不会改善地址符号化,却增加隐私风险;优先使用阶段码和脱敏复现。

需要避免的失败模式

  • 使用同名但构建身份不匹配的符号库,得到看似合理的错误栈。
  • 把原始 tombstone、提示词或本地路径默认发给普通支持渠道。

Avoid two specific pitfalls: writing logs that capture native stacks together with prompts, and allowing release builds to lose their symbols. Limit any release-facing wording strictly to what the recorded evidence supports and do not add claims, hints, or details not covered by the preserved material.

最小复现记录

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

发布检查表

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

来源与相关证据

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

常见问题

能否用任意同名库给崩溃做符号化?

不能。地址属于特定二进制构建与 ABI。必须使用匹配的未剥离符号并核验身份;邻近版本可能输出看似合理但错误的位置,应先核对构建标识。

符号化堆栈能证明模型与设备不兼容吗?

不能。它提供的是某次崩溃的执行位置证据。根因需要复现和阶段分析;设备支持主张还需要准确制品、运行时、系统与硬件的独立证据。

崩溃包应该包含触发推理的提示词吗?

默认不应包含。尽可能用合成夹具复现,并保留脱敏阶段元数据。提示词、转写、图片和生成结果可能私密,也不是把原生地址映射到符号所必需的材料。