以下的
simpleperf目录替换为自己的文件目录 我这里使用的都是绝对路径
常见 simpleperf 编译命令
#WINDDOWS SDK path
F:\Android\Sdk\ndk\29.0.14206865\toolchains\llvm\prebuilt\windows-x86_64\bin
# -g: 收集函数调用栈信息 -o 指定output文件 采集时间5s 采集的二进制文件
simpleperf record -g -o /data/local/tmp/rust_dir/perf.data --duration 5 ./cross_rust
查看 android 平台,选用适合的交叉编译
getprop ro.product.cpu.abi#模拟器 output
x86_64
为 rust 进行交叉编译(以 x86_64 为例子)
#临时镜像加速
#$env:RUSTUP_UPDATE_ROOT="https://mirrors.sjtug.sjtu.edu.cn/rust-static/rustup/"
#$env:RUSTUP_DIST_SERVER="https://mirrors.sjtug.sjtu.edu.cn/rust-static"
rustup target add x86_64-linux-android
检测当前编译链
#当前rust的交叉编译
rustup target list --installed# output
x86_64-linux-android
x86_64-pc-windows-msvc
# Android version
adb shell getprop ro.build.version.release# output
15#Android API LEVEL
adb shell getprop ro.build.version.sdk35
应该使用x86_64-linux-android35-clang的版本进行交叉
如何配置config.toml文件
# 对 ARM 64 位 (aarch64) Android 设备的配置[target.aarch64-linux-android]# 链接器路径修改为 aarch64 对应的文件
# 注意:你需要根据你的 NDK 版本和实际文件名称来调整路径
linker = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android35-clang.cmd"# C 编译器(如果需要)
# cc = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android35-clang.cmd"rustflags = ["-C", "link-arg=-target","-C", "link-arg=aarch64-unknown-linux-android35" # 目标也改为 aarch64
][target.x86_64-linux-android]# 链接器 (Linker) 的完整路径
# 注意:Windows NDK 工具链中的 clang 通常是一个 .cmd 或 .exe 文件。
# 我们使用 .cmd 文件,如果不行,请尝试使用 x86_64-linux-android-clang.exe
linker = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\x86_64-linux-android35-clang.cmd"# C 编译器 (CC) 的完整路径 (Rust 在编译 C/C++ 依赖时可能需要)
# cc = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\x86_64-linux-android35-clang.cmd"# 可选:指定 Android API 级别。35 是你路径中包含的版本
rustflags = ["-C", "link-arg=-target","-C", "link-arg=x86_64-unknown-linux-android35"
]
进行交叉编译的参数
#默认是debug 否则需要 ... build --release ...
cargo build --target x86_64-linux-android
FlameGprah.svg生成和导出的步骤
adb shell
cd /data/local/tmp/rust_dir#采集perf.data 保留符号 采集的名字叫做 perf.data 采集时间5s 对./cross_rust 可执行文件采集
simpleperf record -g -o /data/local/tmp/rust_dir/perf.data --duration 5 ./cross_rust#拉出来文件
adb pull /data/local/tmp/rust_dir/perf.data .```sh
adb shell
cd /data/local/tmp/rust_dir#拉出来文件
adb pull /data/local/tmp/rust_dir/perf.data .# 调用 ndk的simpleperf Python脚本
# -i 输入数据文件 -symfs 符号文件系统(Symbol File System) 用于解析地址到函数名
# --symfs 二进制文件所在目录
# FlameGraph的 stackcollapse-perf 脚本 读取调用栈数据,将相同的调用栈序列折叠
# 读取折叠后的堆栈信息和计数,生成SVG
# 导出svg
python F:\Android\Sdk\ndk\29.0.14206865\simpleperf\report_sample.py -i perf.data --symfs D:\code\doc_for_harmony_project\filament\rust_test\target\x86_64-linux-android\debug | perl D:\code\FlameGraph\stackcollapse-perf.pl | perl D:\code\FlameGraph\flamegraph.pl > test_root.svg
cross_rust的rs文件和对crross_rust的调用链的解释
cross_rust.rs
| 级别 | 函数/方法 | 结构体/模块 | 职责描述 |
|---|---|---|---|
| Level 0 | main() |
main.rs |
程序的起点,负责协调整个流程。 |
| Level 1 | Graph::new() |
Graph |
初始化图结构体及其所有内部数组和向量。 |
| Level 1 | Graph::build_with_sample_data() |
Graph |
构建图:定义节点数,并读取内置的边数据。 |
| Level 2 | Graph::add_edge() (多次) |
Graph |
根据边数据,向图的邻接表中添加边(双向)。 |
| Level 1 | Graph::prim() |
Graph |
执行 Prim 算法:寻找最小生成树的核心逻辑。 |
| Level 2 | BinaryHeap::new() |
std::collections |
初始化优先队列。 |
| Level 2 | BinaryHeap::push() |
std::collections |
将起始节点推入优先队列。 |
| Level 2 | BinaryHeap::pop() (循环内) |
std::collections |
取出权值最小的边。 |
| Level 2 | self.tt.push() (条件满足时) |
Graph |
将找到的 MST 边记录到结果集合中。 |
| Level 1 | Graph::print_mst_edges() (条件满足时) |
Graph |
输出结果:格式化打印 MST 的所有边。 |