$38
Analyze compilation efficiency for individual source files in the ACE Engine project. This skill provides detailed insights into compilation time, resource overhead, and header file dependencies to help identify optimization opportunities.
Compilation analysis helps identify performance bottlenecks in the build process by measuring:
Critical Requirements:
out/{product} directory (not from the project root)parse_ii.py script to analyze .ii files - do not use alternative methodsUse this analysis when:
Identify the target source file for analysis. Source files in ace_engine typically follow patterns:
frameworks/core/components_ng/base/frame_node.cppframeworks/bridge/declarative_frontend/engine/js_engine.cppThe analysis scripts automatically locate the OpenHarmony root directory by searching for the .gn file marker. Navigate to the OpenHarmony root directory to ensure proper path resolution.
Option A: Full Analysis (Execute + Display Results)
./.claude/skills/compile-analysis/scripts/analyze_compile.sh <source-file> [product-name]
Example:
./.claude/skills/compile-analysis/scripts/analyze_compile.sh frameworks/core/components_ng/base/frame_node.cpp rk3568
Option B: Save Reusable Compilation Script
Generate a standalone script that can be executed multiple times for performance testing:
./.claude/skills/compile-analysis/scripts/analyze_compile.sh <source-file> [product-name] --save-script
This creates out/{product}/compile_single_file_{name}.sh with:
The analysis produces three key outputs:
MM:SS.mm)When using --save-script, a reusable script is generated for repeated performance testing.
Primary entry point for compilation analysis. Orchestrates the entire analysis workflow:
Usage:
# Full analysis with execution
./.claude/skills/compile-analysis/scripts/analyze_compile.sh <source-file> [product-name]
# Save standalone compilation script
./.claude/skills/compile-analysis/scripts/analyze_compile.sh <source-file> [product-name] --save-script
Arguments:
source-file - Path to the source file (relative to ace_engine root or absolute)product-name - Target product (default: rk3568)--save-script - Save enhanced compilation command to reusable script fileWorkflow:
out/{product}/compile_single_file_{name}.shOutput with --save-script:
out/{product}/compile_single_file_{name}.shExtracts the complete compilation command for a source file from the ninja build system.
Usage (from ace_engine root):
# Display commands only
python3 ./.claude/skills/compile-analysis/scripts/get_compile_command.py \
<source-file> <openharmony_root>/out/<product>
# Save enhanced command (with performance monitoring)
python3 ./.claude/skills/compile-analysis/scripts/get_compile_command.py \
<source-file> <openharmony_root>/out/<product> --save-enhanced
Example:
# From ace_engine directory
python3 ./.claude/skills/compile-analysis/scripts/get_compile_command.py \
frameworks/core/components_ng/base/frame_node.cpp \
/home/sunfei/workspace/openHarmony/out/rk3568 --save-enhanced
Features:
-save-temps for analysis)Output:
--save: Creates {file}_compile_command.sh (original command)--save-enhanced: Creates compile_single_file_{file}.sh (enhanced with monitoring)Analyzes .ii preprocessed files to extract and display header file dependencies.
Usage:
python3 ./.claude/skills/compile-analysis/scripts/parse_ii.py <ii-file>
Features:
#include directives targeting foundation/arkui/Output Format:
头文件的依赖关系树:
└── foundation/arkui/ace_engine/frameworks/core/components_ng/base/frame_node.h
└── foundation/arkui/ace_engine/frameworks/core/components_ng/base/ui_node.h
├── foundation/arkui/ace_engine/frameworks/core/pipeline/base/element.h
└── ...
Format: MM:SS.mm (minutes:seconds.milliseconds)
Reported in kilobytes (KB)
The tree shows hierarchical include relationships:
#include directiveOptimization indicators:
When you need to analyze the header file dependency structure of a source file:
Important: This workflow ONLY uses .ii files generated by compilation scripts. No other dependency analysis methods are used.
Workflow:
.ii file exists in out/{product}/obj/ directory.ii exists → Parse it directly with parse_ii.py.ii doesn't exist → Generate it using compilation script, then parseout/{product}/{file_name}_dependency_tree.txtExample using Claude:
# User request: "分析 frame_node.cpp 的头文件依赖"
# Claude's response:
# Step 1: Check for existing .ii file
# ✓ Found: out/rk3568/obj/.../frame_node.ii
# Step 2: Parse .ii file and save dependency tree
python3 ./.claude/skills/compile-analysis/scripts/parse_ii.py \
out/rk3568/obj/.../frame_node.ii \
--output out/rk3568/frame_node_dependency_tree.txt
# Output:
# 头文件的依赖关系树:
# └── foundation/arkui/ace_engine/frameworks/core/components_ng/base/frame_node.h
# ├── foundation/arkui/ace_engine/frameworks/core/components_ng/base/ui_node.h
# │ ├── foundation/arkui/ace_engine/frameworks/core/pipeline/base/element.h
# │ └── foundation/arkui/ace_engine/base/memory/ace_type.h
# └── foundation/arkui/ace_engine/frameworks/core/components_ng/property/property.h
#
# ✓ 依赖树已保存到: out/rk3568/frame_node_dependency_tree.txt
If .ii file doesn't exist:
# User request: "这个文件依赖了多少头文件 text_theme.cpp"
# Claude's response:
# Step 1: Check for existing .ii file
# ✗ .ii file not found
# Step 2: Check for compilation script
# ✓ Found: out/rk3568/compile_single_file_text_theme.sh
# Step 3: Generate .ii file by running compilation script
cd out/rk3568
bash compile_single_file_text_theme.sh
# Step 4: Parse .ii file and save dependency tree
python3 ../../.claude/skills/compile-analysis/scripts/parse_ii.py \
obj/.../text_theme.ii \
--output text_theme_dependency_tree.txt
# Output:
# 头文件的依赖关系树:
# └── foundation/arkui/ace_engine/frameworks/core/components/text/text_theme.h
# ├── ...
#
# ✓ 依赖树已保存到: out/rk3568/text_theme_dependency_tree.txt
#
# 统计信息:
# - 总计依赖: 47 个头文件
# - 最大深度: 6 层
If neither .ii nor script exists:
# User request: "头文件依赖关系 button_pattern.cpp"
# Claude's response:
# Step 1: Check for existing .ii file
# ✗ .ii file not found
# Step 2: Check for compilation script
# ✗ Compilation script not found
# Step 3: Generate compilation script first
python3 ./.claude/skills/compile-analysis/scripts/get_compile_command.py \
frameworks/core/components_ng/pattern/button_pattern.cpp \
<openharmony_root>/out/rk3568 --save-enhanced
# ✓ Script generated: out/rk3568/compile_single_file_button_pattern.sh
# Step 4: Generate .ii file by running script
cd out/rk3568
bash compile_single_file_button_pattern.sh
# Step 5: Parse .ii file and save dependency tree
python3 ../../.claude/skills/compile-analysis/scripts/parse_ii.py \
obj/.../button_pattern.ii \
--output button_pattern_dependency_tree.txt
# ✓ 依赖树已保存到: out/rk3568/button_pattern_dependency_tree.txt
Trigger phrases:
Output file naming:
{file_name}_dependency_tree.txtout/{product}/out/rk3568/frame_node_dependency_tree.txtConstraints:
.ii files using parse_ii.py.ii if neededout/{product}/{file_name}_dependency_tree.txtWhen you need to compile a single file in isolation (for testing, debugging, or verification):
Important: This workflow ONLY uses pre-generated compilation scripts. No other compilation methods are used.
Workflow:
out/{product}/compile_single_file_{name}.shExample using Claude:
# User request: "单独编译 frame_node.cpp"
# Claude's response:
# Step 1: Check for existing script
# ✓ Found: out/rk3568/compile_single_file_frame_node.sh
# Step 2: Execute the script
cd out/rk3568
bash compile_single_file_frame_node.sh
# Output:
# 编译时间: 0:08.23
# 峰值内存: 234567 KB
# ✓ 已生成: obj/.../frame_node.ii obj/.../frame_node.o
If script doesn't exist:
# User request: "单编 text_theme.cpp"
# Claude's response:
# Step 1: Check for existing script
# ✗ Script not found: out/rk3568/compile_single_file_text_theme.sh
# Step 2: Generate script first
python3 ./.claude/skills/compile-analysis/scripts/get_compile_command.py \
frameworks/core/components/text/text_theme.cpp <openharmony_root>/out/rk3568 --save-enhanced
# ✓ Script generated: out/rk3568/compile_single_file_text_theme.sh
# Step 3: Execute the script
cd out/rk3568
bash compile_single_file_text_theme.sh
Trigger phrases:
Constraints:
compile_single_file_{name}.sh scriptsWhen you need to extract or save compilation commands for later use:
Save standalone script with performance monitoring:
./.claude/skills/compile-analysis/scripts/analyze_compile.sh \
frameworks/core/components_ng/base/frame_node.cpp rk3568 --save-script
# Script saved to: out/rk3568/compile_single_file_frame_node.sh
# Execute later: cd out/rk3568 && bash compile_single_file_frame_node.sh
Extract command only without execution:
python3 ./.claude/skills/compile-analysis/scripts/get_compile_command.py \
frameworks/core/components_ng/base/frame_node.cpp \
<openharmony_root>/out/rk3568 --save-enhanced
This is useful for:
When incremental builds are slower than expected:
./analyze_compile.sh <slow-file>To reduce unnecessary recompilation:
Measure optimization impact using saved scripts:
Generate baseline script:
./analyze_compile.sh <file> rk3568 --save-script
cd out/rk3568
Run baseline measurement:
bash compile_single_file_{name}.sh
# Record: 编译时间: 0:15.23, 峰值内存: 456789 KB
Apply optimizations (reduce includes, forward declarations, etc.)
Run comparison measurement:
bash compile_single_file_{name}.sh
# Record: 编译时间: 0:08.45, 峰值内存: 234567 KB
Compare results to quantify improvements
The saved script ensures identical compilation conditions for fair comparison.
Cause: Source file path doesn't match build database Solutions:
Cause: Compilation with -save-temps failed or file not created
Solutions:
-save-temps=obj flagfind out/<product>/obj -name "*.ii"Cause: parse_ii.py filters for foundation/arkui/ prefix only
Solutions:
target_prefix in parse_ii.py to include other pathsFor detailed workflows and advanced usage:
references/workflow.md - Comprehensive workflow guidereferences/optimization.md - Optimization strategies and patternsWorking examples in examples/:
examples/example-analysis.sh - Complete analysis exampleexamples/example-output.txt - Sample output with interpretationThis skill integrates with the OpenHarmony GN/Ninja build system:
out/<product>/ directorytoolchain.ninja for compiler rulesThe enhanced compilation command modifies the original command by:
-save-temps=obj (to generate .ii files)/usr/bin/time (to measure resources)-Wno-undefined-bool-conversion)This ensures accurate measurements while maintaining compilation compatibility.