with one click
apifault-analysis
定位开发者问题。当用户输入错误码、错误信息、错误日志、执行失败或需要定位问题时使用。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
定位开发者问题。当用户输入错误码、错误信息、错误日志、执行失败或需要定位问题时使用。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
提供使用 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。