con un clic
apifault-analysis
定位开发者问题。当用户输入错误码、错误信息、错误日志、执行失败或需要定位问题时使用。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
定位开发者问题。当用户输入错误码、错误信息、错误日志、执行失败或需要定位问题时使用。
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
提供使用 CameraX 进行 Android 相机开发的技术指导。当实现相机功能、处理异步录制生命周期、使用 CameraX 进行底层硬件互操作,或集成 ML Kit 或 Media3 特效时使用。
提供基于 Android Credential Manager API 实现已验证邮箱获取的完整工作流。使用此 skill 向 Android 应用集成安全、免 OTP 的邮箱验证流程。该 skill 利用来自 Google 等可信提供商的加密验证凭证,解决注册流程摩擦过大的问题。
提供让应用 UI 适配不同 Android 设备(手机、平板、折叠屏、笔记本、桌面、TV、Auto 和 XR)的说明。涵盖使用 Compose MediaQuery API 处理不同窗口尺寸、指针设备(如鼠标)和文本输入设备(如键盘);使用 Navigation3 Scenes 实现多窗格布局;使用 Compose Grid 和 FlexBox API 实现随目标尺寸变化的自适应 UI 组件(如按钮)和自适应布局(含导航区——nav rails 和 nav bars)。
提供将 Android XML View 迁移到 Jetpack Compose 的结构化工作流。该 skill 详述从规划和依赖设置,到主题和布局迁移、验证及 XML 清理的分步流程。当需要在 Android 项目中把 XML View 迁移到 Jetpack Compose 时使用。它解决将旧版 XML View 的 UI 转换为现代声明式 Compose 组件、同时保持互操作性的问题。
使用此 skill 将 Jetpack Compose Styles API 集成到 Android 项目。引导你升级依赖、设置组件主题、让自定义组件可样式化,以及将现有布局属性迁移到统一样式。迁移自定义设计系统组件、用 Style 属性替换硬编码参数、使用 Modifier.styleable 处理交互状态。
学习如何安装并迁移到 Jetpack Navigation 3,以及如何实现 deep links、多个 backstack、scenes(对话框、底部表、list-detail、two-pane、supporting pane)、条件导航(如已登录导航 vs 匿名导航)、从流程返回结果、与 Hilt/ViewModel/Kotlin/View 互操作集成等功能和模式。
| name | apifault-analysis |
| description | 定位开发者问题。当用户输入错误码、错误信息、错误日志、执行失败或需要定位问题时使用。 |
帮助开发者诊断问题的 Agent Skill。接收问题描述和故障日志,通过环境发现 + 项目代码分析 + 两阶段分级诊断,输出结构化诊断报告。
本 Skill 同时适用于 DevEco Studio CodeGenie 与终端 Agent(如 Claude Code、OpenCode 等 CLI)两种环境,支持 Windows 与 macOS 宿主平台。阶段 0 自动探测宿主 OS 与 shell,后续平台相关命令按 shell 分支执行。知识库内嵌于 references/knowledge/。
工具名映射、选择原则与降级方案(W/E)见 references/tool_mapping.md。下文统一用 CodeGenie 的 builtin_* 工具名描述;终端 Agent(如 Claude Code、OpenCode 等 CLI)执行时按该表替换为对应工具。
| 参数 | 必填 | 说明 |
|---|---|---|
problem_description | 是 | 开发者对问题的文字描述 |
log_content | 否 | 故障日志原文(hilog、HiviewDFX crash/freeze 等) |
log_content_file | 否 | 日志文件路径(当日志较长时优先于log_content) |
code_snippet | 否 | 相关代码片段 |
references/log_patterns.mdreferences/module_mapping.md(含代码仓/文档仓 URL)references/knowledge/{module_name}/(error_codes.json、api_chain.json、common_issues.md、overview.md、file_corruption_patterns.md)references/scripts/media_file_analyzer.pyreferences/scripts/hilog_collector.py按顺序执行以下阶段。
目标: 探测宿主平台与运行环境,确定项目根目录、SDK 路径,发现 hilogtool,创建输出目录。
平台与运行环境检测:探测宿主 OS、可用 Python 命令与 shell 类型,后续平台相关命令按 shell 分支执行。
builtin_execute_command 执行 python3 -c "import platform; print(platform.system())";若 python3 不可用(返回非零退出码),改执行 python -c "import platform; print(platform.system())":
Windows → host_os = windows(SDK 路径分隔符 \,hilogtool 二进制名带 .exe)Darwin → host_os = macos(路径分隔符 /,hilogtool 无后缀)builtin_execute_command 执行 uname -s:
host_shell = bash(POSIX,覆盖 macOS bash/zsh 与 Windows Git Bash / 终端 Agent)host_shell = powershell(CodeGenie on Windows 默认)py_cmd 记录本次成功的 Python 命令(python3 或 python),后续所有脚本调用统一使用它host_shell 取值分支(bash 分支的 POSIX 命令在 Windows Git Bash 与 macOS 均可用;powershell 分支用 cmdlet)确定项目根目录:当前工作目录即为项目根目录。通过 builtin_read_file 读取 local.properties,提取 sdk.dir= 行获取 SDK 路径(Windows 路径分隔符为 \,macOS 为 /)。若文件不存在或无 sdk.dir,尝试 builtin_read_file 读取 build-profile.json5 获取 API 版本信息。若均不可用,在对话中询问用户 SDK 路径。
创建输出目录:在项目根目录下创建诊断报告输出目录,按 host_shell 分支:
host_shell == bash:builtin_execute_command 执行 mkdir -p diagnosishost_shell == powershell:builtin_execute_command 执行 New-Item -ItemType Directory -Force -Path diagnosis | Out-Null发现 hilogtool:在 SDK 路径下查找 hilogtool(用于解析二进制 hilog 日志)。候选二进制名按平台区分,候选目录两平台一致:
host_os 区分:host_os == windows → hilogtool.exe;host_os == macos → hilogtool(无后缀)host_shell 区分:host_shell == bash → builtin_execute_command 执行 test -f "{路径}";host_shell == powershell → 执行 Test-Path "{路径}"{sdk_path}/hms/toolchains/{候选名}{sdk_path}/default/hms/toolchains/{候选名}hilogtool_path(完整路径)并停止查找hilogtool_path = null,后续日志采集将使用 gzip 降级方案记录路径:host_os(windows/macos)、host_shell(bash/powershell)、py_cmd(python3 或 python)、project_root(当前工作目录)、sdk_path(SDK 路径)、hilogtool_path(hilogtool 完整路径或 null)、output_dir(diagnosis/)。
目标: 从输入中提取所有可用线索,识别涉及的模块。
解析输入:根据输入类型采用不同解析策略:
log_content_file:先使用 builtin_read_file 读取该文件(大文件使用 offset/limit 分页),再按 references/log_patterns.md 中定义的格式解析log_content(无 log_content_file 时):按 references/log_patterns.md 解析,提取错误码、事件名、DOMAIN、调用栈(含 .so 库名)、hilog domain_idproblem_description:提取错误码数字、API 名称、功能关键词、错误现象描述code_snippet:提取涉及的 API 调用和错误处理逻辑模块识别:使用 builtin_read_file 读取 references/module_mapping.md,用提取的线索匹配模块:
2.1 Kit名推断:根据识别结果推断 Kit名:
clues.kit_names线索汇总:将所有提取的线索以结构化格式记录:
clues = {
error_codes: [],
event_names: [],
domains: [],
call_stack_highlights: [],
so_libraries: [],
modules: [],
api_names: [],
hilog_domain_ids: [],
kit_names: [],
}
模块识别失败处理:若所有线索均无法匹配到已知模块,标注 module_identified = "未识别"。
日志采集与解析(强制执行,不可跳过):日志是诊断的核心依据,必须优先获取和解析。除非用户明确要求跳过日志采集,否则必须执行本步骤,不得以任何理由省略(包括但不限于:模块未识别、问题描述看似简单、用户未提供日志等)。按以下优先级获取:
优先级 1 — 使用用户提供的日志:若已有 log_content 或 log_content_file,直接使用,跳过采集步骤。
优先级 2 — 通过 hdc 读取设备落盘日志:若无用户提供的日志,按以下流程获取设备落盘日志。
步骤 A — 使用脚本采集并解析设备落盘日志:
执行 references/scripts/hilog_collector.py 脚本,自动完成设备日志拉取和解析:
builtin_execute_command: {py_cmd} "{skill_dir}/references/scripts/hilog_collector.py" --output-dir diagnosis {若 hilogtool_path 不为 null 则添加: --hilogtool "{hilogtool_path}"} --time-window 10
参数说明:
--hilogtool:阶段 0 发现的 hilogtool 路径。若 hilogtool_path 为 null,省略此参数,脚本将使用 gzip 降级方案--time-window:筛选创建时间在指定分钟数以内的日志文件脚本输出 JSON 结果到 stdout:
status:success(成功)、partial(部分采集/解析:时间预算耗尽或部分文件失败,已按"最新优先"尽力返回日志)、no_logs(设备无日志)、no_device(设备未连接)、error(未捕获异常)parsed_files:解析后的文本文件路径列表(按时间从旧到新排序)hilogtool_used:是否使用了 hilogtoolpartial(是否部分结果)、failed_files(拉取失败/被跳过的文件)、cached_files(命中缓存未重拉的文件)、reason(部分原因)、timed_out(是否触达时间预算)、elapsed_s(耗时秒)脚本执行后,使用 builtin_read_file 按 parsed_files 列表顺序(从旧到新)逐个读取解析后的日志文件,执行问题相关性检查:
时间顺序判断:parsed_files 列表已按文件名时间戳从旧到新排序。文件名中包含时间戳(格式如 hilog.305.20260524-152948.log → 2026-05-24 15:29:48,设备本地时间)。skill 按列表顺序从旧到新逐个读取和分析。
clues.error_codes、clues.api_names、clues.so_libraries、clues.domains 中的已知值problem_description 提取的功能关键词Generated by HiviewDFX@OpenHarmony若 status 为 no_device 或 error:在诊断报告中标注"hdc 日志采集失败({message})",继续后续阶段。
若 status 为 partial:脚本在时间预算内尽力采集,parsed_files 仍可按时间顺序读取(可能少于完整集合,或为 gzip 降级后的文本)。在诊断报告中注明"日志采集部分超时/不完整({reason})"后,继续按 parsed_files 执行问题相关性检查——不得因 partial 而跳过日志分析。
若 status 为 no_logs:进入步骤 B 开启落盘。
若 hilogtool_used 为 false:在诊断报告中注明"hilogtool 不可用,日志可能包含乱码"。
步骤 B — 无落盘日志时,开启落盘并等待用户触发:
a. 执行以下命令开启日志落盘(单文件 5M,最大 10 个文件,zlib 压缩):
builtin_execute_command: hdc shell "hilog -w start -f diag -l 5M -n 10 -m zlib -j 11"
b. 立即中断当前执行,向用户输出以下提示(不生成诊断报告):
日志落盘已开启。请在设备上操作触发错误,完成后回复 "OK" 继续诊断。
c. 当用户回复"OK"后,停止落盘并拉取日志:
i. 停止落盘:
builtin_execute_command: hdc shell "hilog -w stop -j 11"
ii. 重新执行步骤 A 的脚本命令拉取并解析新生成的日志文件,然后按步骤 A 相同规则执行问题相关性检查。
采集失败处理:
关键注意事项:
references/scripts/hilog_collector.py,封装了设备检查、文件拉取、hilogtool/gzip 解析。脚本仅负责拉取和解析,不合并、不做相关性检查,由 skill 按时间顺序逐个读取和分析--collect-timeout),触达预算时返回 partial 状态而非挂起——即便外层 builtin_execute_command 有 30s 硬超时,也不会被强杀而零输出。可调选项(默认值已对 30s 超时安全,SKILL 调用无需改动):--max-files(默认 6,窗口内 .gz 按最新优先截断)、--max-bytes/--max-bytes-per-file(字节上限)、--workers(并行拉取,默认 4)、--fresh(禁用缓存强制重拉)、--include-untimestamped-gz(默认不拉无时间戳的 .gz)。重复采集(如步骤 B 二次拉取)默认命中缓存、跳过已拉文件py_cmd(Windows 通常 python、macOS 通常 python3)clues(错误码、API 名称、模块、.so 库等),确保读取的日志与用户报告的具体问题相关,而非泛泛匹配任何错误状态机转换序列追踪(日志分析时必须执行,基于上一步已就绪的日志):
stateChange、reset、stop、prepare 等状态相关事件时,按时间轴排列所有状态转换事件clues 中(新增字段 state_transitions)目标: 快速查询知识库和文档,评估是否可以直接给出诊断。
若阶段 1 识别到了模块,使用 builtin_read_file 读取 references/knowledge/{module_name}/ 下的文件(下列步骤 1–4 均在此前提下执行):
错误码精确匹配:读取 error_codes.json,按提取到的错误码查找匹配项
API 调用链匹配:读取 api_chain.json,按提取到的 API 名称查找调用链
故障案例匹配(强制执行,不得因 glob 失败而跳过):若阶段1提取的 clues.kit_names 不为空,对其中每个 KitName 在 references/knowledge/fault-cases/ 目录下查找案例文件。
关键陷阱——用 {skill_dir} absolute path定位,别靠 cwd 裸 glob: fault-cases 目录位于 skill 目录内({skill_dir}/references/knowledge/fault-cases/,{skill_dir} 即 SKILL.md 所在目录的absolute path)。{skill_dir} 与被诊断项目 cwd 的相对关系不固定:skill 通常装在项目之外(如 ~/.claude/skills/ 或插件缓存目录),但也可能被 vendoring 进项目仓库内部。因此对 cwd 的裸 glob(如 {KitName}-Fault-Cases-*.md)不可靠——裸 glob 默认锚定 cwd,而 skill 目录相对 cwd 的偏移未知,极易 0 命中、被误判为"无案例"而跳过本步(这正是此前 2.1.3 被跳过的原因)。正确做法:以 {skill_dir} absolute path为搜索根——builtin_execute_command(shell)的 ls/find,或把 builtin_glob/builtin_grep 的 path 显式设为该absolute path:
builtin_execute_command 列举absolute path目录内容(按 host_shell 分支):
host_shell == bash:ls "{skill_dir}/references/knowledge/fault-cases/"host_shell == powershell:Get-ChildItem "{skill_dir}/references/knowledge/fault-cases/" -Name{KitName}-Fault-Cases-*.md 的文件(如 CoreFileKit-Fault-Cases-0.md、ArkData-Fault-Cases-1.md)。匹配忽略大小写;多个 KitName 各自独立匹配;同一 Kit 的多个案例文件(-0、-1…)全部纳入。builtin_read_file 读取其absolute path "{skill_dir}/references/knowledge/fault-cases/{文件名}"(用absolute path,避免再次落入 cwd 相对解析)。builtin_grep 对上述absolute path文件/目录执行关键词搜索。{KitName}-Fault-Cases-* 文件命中时,才标注"无该 Kit 的故障案例"并继续后续步骤——严禁因 glob 失败、列举命令报错或某 Kit 0 命中而整体跳过 2.1.3;若列举命令本身失败,先用 builtin_read_file 读取目录absolute path重试,仍失败则在报告中注明原因后继续。常见问题匹配:读取 common_issues.md,搜索与问题现象匹配的模式
额外知识文件搜索(条件执行):当「模块已识别但步骤 1–4 不足以支撑问题定位」或「模块未识别(阶段 1 module_identified = "未识别")」时执行。两种情况搜索范围一致,均为整个 references/knowledge/,以阶段 1 提取的 clues(错误码、API 名称、.so 库、DOMAIN、功能关键词)作为关键词。
absolute path定位(同 2.1.3):本步搜索整个 references/knowledge/,同样在 skill 目录内、与项目 cwd 相对关系不固定——用 {skill_dir} absolute path列举与搜索,不要靠 cwd 裸 glob。
host_shell 分支):
host_shell == bash:find "{skill_dir}/references/knowledge/" -type fhost_shell == powershell:Get-ChildItem -Path "{skill_dir}/references/knowledge/" -Recurse -File | Select-Object -ExpandProperty FullNameclues 关键词对上述absolute path目录递归搜索,聚焦步骤 1–4 未覆盖到的文件(按 host_shell 分支):
host_shell == bash:grep -rEn "关键词1|关键词2|…" "{skill_dir}/references/knowledge/"(-r 递归、-E 扩展正则、-n 带行号;用 | 连接多个关键词)host_shell == powershell:Get-ChildItem "{skill_dir}/references/knowledge/" -Recurse -File | Select-String -Pattern "关键词1","关键词2" | Select-Object -ExpandProperty Path -Uniquebuiltin_grep(Grep 工具),把 path 显式设为 "{skill_dir}/references/knowledge/" absolute path。builtin_read_file 读其absolute path定位证据。若命中某模块的知识库内容,可将其回填为候选模块,并照常汇入 2.3 置信度评估。触发条件: 错误码包含 5400103、5400106 或 5400102(仅当日志涉及文件路径/URI 时)
参考文件: references/knowledge/multimedia_player_framework/file_corruption_patterns.md
确认文件路径:
problem_description 或 code_snippet 中包含可识别的媒体文件路径 → 使用提取的路径builtin_glob 在项目目录搜索:**/*{filename}*builtin_glob 搜索项目中的媒体文件:**/*.{mp4,mkv,ts,m4a,aac,mp3,flac,wav,ogg,amr}执行文件分析脚本:
builtin_execute_command 运行:
{py_cmd} "{skill_dir}/references/scripts/media_file_analyzer.py" --file "{media_file_path}" --json
py_cmd;若 python3/python 均不可用,则降级为基于 file_corruption_patterns.md 的手动日志模式匹配解析脚本结果并交叉验证 hilog:
overall_assessment、issues、error_code_correlationbuiltin_read_file 读取 file_corruption_patterns.md 第 3 节速查表,用阶段 1 提取的 hilog 关键字匹配损坏模式结果处理:
unsupported_format → 直接以高置信度返回结论likely_corrupt / possibly_corrupt → 将文件损坏作为 rank 1 根因候选healthy → 文件无问题,需深入排查其它原因unknown_format → 文件可能严重损坏,中置信度analysis_error → 文件不可达,中置信度references/tool_mapping.md 降级方案 W)references/module_mapping.md 中有该模块的 errorcode 文档路径,使用 builtin_execute_command + curl 获取:curl -sL "https://gitee.com/openharmony/docs/raw/master/{errorcode_path}"高置信度(跳过阶段 3 深潜分析,经阶段 4 进入阶段 5 输出):
低置信度(进入阶段 3 深潜分析):
如果置信度为高,跳过阶段 3 深潜分析,直接进入阶段 4(项目源码分析与修复建议),再进入阶段 5 输出。阶段 4 与阶段 5 无论置信度都必须执行。
目标: 深入分析代码实现和文档,构建完整的证据链。
执行方式(按运行环境分流): 阶段 3 的执行方式因环境而异——
Agent 工具委派子 Agent 整体执行(3.1→3.5 为子 Agent 内部步骤,合成留在子 Agent 内);大块原始抓取不进入主上下文,主 Agent 仅派发并接收结构化结论。报告「根因分析」处无需额外标注。
clues、阶段 2 分诊结论与判低置信的原因、module_identified 与 references/knowledge/{module}/ 路径、references/module_mapping.md、宿主变量(host_os/host_shell/py_cmd/project_root/sdk_path/hilogtool_path/output_dir);子 Agent 按 references/tool_mapping.md 选用工具。{ diagnostic_depth: "deep_dive",
root_cause_candidates: [
{ rank, confidence, description(追溯到应用侧行为),
evidence: [ { finding, source_type: knowledge_base|documentation|code, source_path } ],
fix_hint(可选) } ],
api_chain_findings(可选), notes(可选) }
(终端:子 Agent 返回结论;CodeGenie:主 Agent 内联执行后即得结论)随后进入阶段 4。
仅当模块有知识库时执行。 使用 builtin_read_file 读取 references/knowledge/{module_name}/api_chain.json,按调用栈中的 C++ 函数名反向追踪。无知识库的模块跳过此步骤。
builtin_read_file 读取 references/module_mapping.md 表 6 获取代码仓 URLbuiltin_execute_command + curl 从 Gitee 代码仓获取源文件*_errors.h、*_error_code.h)获取错误码定义builtin_glob 在 SDK 路径中搜索相关 .d.ts 文件,使用 builtin_grep 搜索错误码定义builtin_web_rag 查询开发指南和 FAQ(终端 Agent 见 references/tool_mapping.md 降级方案 W)builtin_execute_command + curl 读取 Gitee 文档仓的开发指南目录核心原则:不停留在框架机制层,必须追溯到应用行为根因。 框架的拦截/防御代码通常是正确的系统行为——根因若停在那里,开发者只会拿到"修改框架"这种无从下手的建议,而非自己代码里可改的一行。
当分析定位到某个框架层的拦截/阻断点时,必须继续追问:是什么应用侧操作触发了这个拦截?追溯链路示例:
现象:seekDone 回调未送达 JS 层
<- 框架机制:isloaded_ == false 导致回调被拦截
<- 为什么 isloaded_ 为 false?因为 ResetTask() 被调用
<- 为什么 ResetTask 被调用?因为开发者调用了 reset()
<- 真正的根因:开发者多次调用 reset()
追溯规则:
目标: 基于阶段 2 的分诊结论与阶段 3 的根因结论(终端:子 Agent 返回;CodeGenie:主 Agent 内联执行所得),分析项目源码,定位具体代码问题并给出修改建议。
扫描项目源码文件:使用 builtin_glob 按模式搜索源码文件:
builtin_glob: **/*.ets
builtin_glob: **/*.ts
builtin_glob: **/*.c
builtin_glob: **/*.cpp
builtin_glob: **/*.h
汇总项目源码文件分布。
读取项目配置:
builtin_read_file 读取 entry/src/main/module.json5(权限声明)builtin_read_file 读取 build-profile.json5(SDK 版本)定位问题相关源码:根据诊断结论中涉及的 API 名称、问题模式以及调用栈中的 C++ 函数名,使用 builtin_grep 搜索相关代码文件,使用 builtin_read_file 读取相关代码段。
源码问题分析:
api_chain.json 检查 API 调用时序是否正确module.json5),并对照 API 要求确认是否匹配builtin_check_editor_errors 检查相关源码文件语法问题(终端 Agent 见 references/tool_mapping.md 降级方案 E)生成具体修改建议:针对定位到的代码问题,给出可直接应用的代码修改方案,写入诊断报告的"修复建议"章节。
汇总源码分析结果:记录到报告中"项目上下文"章节。
目标: 构建诊断报告并写入文件。
使用 builtin_execute_command 获取时间戳,按 host_shell 分支:
host_shell == bash:date +%Y%m%d_%H%M%Shost_shell == powershell:Get-Date -Format 'yyyyMMdd_HHmmss'使用 builtin_write_file 将诊断报告写入 diagnosis/diagnosis_{timestamp}.md
报告严格遵循 references/report_template.md 的 Markdown 模板、诊断置信度标准与关键要求。阶段 5 输出时读取该文件,按字段填充后写入 diagnosis/diagnosis_{timestamp}.md。