内存工具-开机/典型场景工具使用指导
来源:飞书 wiki(obj_token: VMY4dntYoosabcxZgdVc7QPHnZe)| 有问题可联系 @谢升军
⚠️ 图片说明:本篇约 25 张图片均为小米内网
internal-api-drive-stream.feishu.cn的 authcode 流链接,MCP 无法访问(权限问题),未能上传图床。已用飞书返回的图片描述文字替代,对理解流程仍有价值。
工具下载地址: 已转存自有文件床,见文末「附录:工具下载」与 附件下载索引.md(含全版本/全平台)。 网盘原链(备份): https://kpan.mioffice.cn/webfolder/ext/H507l6zdDJX$uVm31GQvyw@@ | 密码:869f
一. 内存数据抓取工具
0. 设备环境配置
- 支持 window 和 Ubuntu20 及其以上环境
- python 版本需 3.11+
- 如果用的 WSL 先配置 adb,黄色部分替换成 windows 的 adb.exe 路径
export ANDROID_ADB_PATH="/mnt/e/download/platform-tools/platform-tools/adb.exe"
alias adb="/mnt/e/download/platform-tools/platform-tools/adb.exe"- O2S 设备需要替换 libGLES_mali.so,非 O2S 不涉及。下载地址在云盘 libGLES_mali 目录下。
📷 图片描述:云盘中 libGLES_mali 目录下的文件夹列表。其中 “libGLES_mali” 文件夹被红色框突出显示,其创建时间为 2026-01-23 14:10,创建者为谢升军。
adb remount
adb push .\libGLES_mali.so /vendor/lib64/egl/
adb reboot- p1 手机测试之前执行(整个测试过程执行一次即可)
adb shell setprop persist.sys.sf.dynamic.cachemiss.trace true
adb shell "stop; start"1. 内存数据抓取工具使用
下载地址:云盘 mem_catch 目录,内存抓取工具支持 windows 和 linux,选择最新版本下载。
📷 图片描述:Windows 系统下”我的文档”文件夹中的内容。其中 “mem_catch” 文件夹被红色框突出显示,创建时间为 2026 年 2 月 5 日 21:55,创建人为谢升军。
如果是 ubuntu 环境,根据 ubuntu 版本选择工具。
📷 图片描述:Windows 系统下,内存数据抓取工具 mem_catch 中 catch_1_0_1 版本下的 tool_linux_1_0_1 文件夹内容。文件夹内有两个文件夹,分别为 unbantu20_22 和 unbantu24,修改时间均为 2026 年 2 月 4 日 15:15,修改人均为谢升军。
使用命令
//linux
./start appdump --package_name <进程名> -b <event buf> -B <stack buf> -a <mem_use buf> -e <堆栈类型> -c --hprof --gs --scenario <场景名> -s <设备序列号> -d <device name>
//windows
.\start.exe appdump --package_name <进程名> -b <event buf> -B <stack buf> -a <mem_use buf> -e <堆栈类型> -c --hprof --gs --scenario <场景名> -s <设备序列号> -d <device name>参数信息
-
-s手机设备序列号 -
-r测试的起始 iter 轮次 -
--package_name测试的进程名(必选),比如 com.android.systemui -
--scenario测试场景名(必选),自定义,命名中不要加_ -
-d设备名称(必选),自定义,可区分设备即可,比如:vivo8750,o2s;命名中不要加_ -
-c是否是开机场景 -
-t设置的抓取自动停止时间(单位:s),如不设置则需要手动暂停 -
--hprof设置抓取 hprof 数据 -
--gs是否抓取 gfxinfo -
--only_showmap是否只抓取 showmap -
-e设置 mem_use 抓取的堆栈数据类型,默认 native,支持 native/mmap/filemap -
-b <event buf>设置 mem_use 的事件 buffer 大小,默认 512,观察到 event lost count 较高时说明有事件丢失,需要调大 -
-B <stack buf>设置 mem_use 的回栈信息 buffer 1 大小,默认 128,观察到 stack lost count 较高时说明有回栈信息丢失,需要调大 -
-a设置 mem_use 的回栈信息 buffer 2 大小,默认 256,可选 256,512,768,968,1024,同 -B 类似,观察到 stack lost count 较高时需要调大 -
--mem_timemem_use 的抓取时间(单位 ms) -
--simpleperf是否抓取 simpleperf -
--simple_bufsimpleperf 的 buf 大小,默认 65536,可选 32768,65536,98304,131072 -
--bugreport是否抓取 bugreport -
--sp_service针对某些用进程名抓不到的进程的特殊设置 -
--chrt_policy设置 mem_use 的 chrt 调度策略,默认 f,可选 r(RR)、o(OTHER) -
--taskset_mask绑定 mem_use 的 cpu 核心,p16 设备需要用 F0 -
--start_command在开机场景测试时,如果进程 kill 后不能重启,可以通过该参数用命令拉起进程。示例:--start_command "am broadcast -n com.miui.misightservice/.MiSightReceiver -a com.misight.intent.action.updateEvent"
常用场景使用命令
(1)开机场景抓取命令
//只抓showmap参数:
//linux命令
./start appdump --only_showmap -c --hprof -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//windows命令
.\start.exe appdump --only_showmap -c --hprof -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//native堆抓取参数:
//linux 命令
./start appdump -b 512 -B 128 -a 256 -e native -c -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//windows命令
.\start.exe appdump -b 512 -B 128 -a 256 -e native -c -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//抓取simpleperf参数
//linux命令
./start appdump --only_showmap -c --hprof -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750 --simpleperf
//windows命令
.\start.exe appdump --only_showmap -c --hprof -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750 --simpleperf(2)通用内存场景抓取命令
//只抓showmap参数:
//linux命令
./start appdump --only_showmap --hprof --gs -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//windows命令
.\start.exe appdump --only_showmap --hprof --gs -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//native堆抓取参数
//linux命令
./start appdump -b 512 -B 128 -a 256 -e native -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//windows命令
.\start.exe appdump -b 512 -B 128 -a 256 -e native -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750
//抓取simpleperf参数
//linux命令
./start appdump --only_showmap --hprof --gs -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750 --simpleperf
//windows命令
.\start.exe appdump --only_showmap --hprof --gs -s <设备序列号> --scenario systemui --package_name com.android.systemui -d vivo8750 --simpleperf2. 采集 symbol 工具
下载地址:
📷 图片描述:内存工具文件夹内的文件列表,其中 “collect_libs” 文件被红色框高亮突出显示。文件夹路径为 “我的文档\内存工具\mem_catch\catch_1.0.1\tool_linux_1.0.1”。
📷 图片描述:位于 “我的文档\内存工具\mem_catch\catch_1.0.1\tool_windows_1.0.1” 路径下的文件列表。其中 “collect_libs.exe” 文件被红色框突出显示。
采集 symbol 工具支持 linux 和 windows 环境。当进行 native 堆测试时需要抓取 symbol,其他测试不用抓。
使用方法:
//获取应用的进程名
adb shell ps -ef | grep 进程名
//进程号为要采集进程的进程号
//linux
./collect_libs --pid <进程号> --pull <symbol输出目录>
//windows
.\collect_libs.exe --pid <进程号> --pull <symbol输出目录>参数解释:
--pid采集进程进程号(必填)--pullsymbol 输出目录(必填)--adb-pathadb 路径(可选),如在 wsl 环境需填,例如:/mnt/d/Tools/platform-tools/adb.exe
3. 测试流程
3.1 开机场景测试流程
- 输入测试命令
📷 图片描述:内存数据抓取工具在开机场景测试流程中输入测试命令后的输出结果。命令为 “python appdump —only_shmem —agrep —gs -s 08879892434848548 -scenario systemui —package_name com.android.systemui -d viv08750 —simpleperf -c”。输出中显示了进程信息(进程名称、PID、内存使用情况等),还提示了”请按 Enter 键后开始操作 APP”。
- 等 rss 稳定后按回车暂停,一次不行,按两次回车
📷 图片描述:开机场景测试流程中 rss 值的显示情况。黑色背景上有多行数据,每行都有”当前 rss 值”字样,右侧对应显示数值,如 686684、686676 等,其中多个数值区域被红色框突出显示。
按回车继续下次测试
3.2 通用场景测试流程
- 输入测试命令等待操作开始起点,在看到”请按 Enter 键后开始操作 APP”后按回车开始测试
- 测试操作结束后按回车结束测试,前台静止 5s,同步采集数据
- 进程进入后台,采集后台静止 30s 数据
📷 图片描述:进程进入后台后采集后台静止 30s 数据时的界面。上方红字提示”进入后台,静置 30s”,下方显示”当前 rss 值 230000”、“当前 rss 值 230008”。
- 按回车继续下次测试
📷 图片描述:一次测试操作提示界面。界面上方显示”Trace 已保存:D:\codebase\memscalpel\scripts\MemHookData”,下方提示”按 Enter 键继续测试,或者输入 ‘q’ 结束测试:”。
3.3 symbol 符号表抓取
当进行 native 堆测试时需要抓取 symbol,其他测试不用抓。用 symbol 工具抓取 symbol,只要系统版本不变,每个进程只需要抓取一次 symbol 数据。
注意事项
在开机测试场景和通用场景测试场景中:
- 抓取 simpleperf 测试时关注丢失率,Samples lost / Samples recorded 不超过 1%,如果超 1%,需要调大
--simple_buf参数。
📷 图片描述:使用 dumpsys meminfo 命令后,simpleperf 抓取的 Samples 相关信息。其中 “Samples recorded: 42,897. Samples lost: 0.” 部分被红色框突出显示。
- 抓取 native 堆测试时关注 stack lost 率和 event lost 率,如超 5%,调大
-B 256 -a 512。
📷 图片描述:内存数据抓取测试中的信息反馈界面,正在获取 hprof 文件。用红色框重点突出”event lost count:0 event lost pct:0.00%“以及两组”stack lost count:0 stack lost pct:0.00%”。
4. 生成产物
1. 产物目录
📷 图片描述:内存数据抓取工具生成产物的目录内容。其中包含多个文件夹,如 gfx_data、hprof、log_data、mem_use_data 等,各文件夹的修改时间均为 2026 年 1 月 25 日 13:20。hprof 文件夹被高亮显示。
产物解释:
gfx_datagfx_info 的信息hprof测试结束抓到的 hprof 信息showmap_datashowmap 数据meminfo_infodumpsys meminfo 数据log_datanative 抓取过程中 log 数据mem_use_data、memuse_filename_data、stack1_data、stack2_datanative 堆内存数据simpleperf_datasimpleperf 抓取的 perf 数据tracesperfetto trace 数据
注意事项:
(1)抓取 native 堆轮次需要确保 mem_use_data、memuse_filename_data、stack1_data、stack2_data、log_data 目录有产物且文件不为空。
(2)抓取 simpleperf 轮次需要确保 simpleperf_data 目录有产物且文件不为空。
2. 每个设备的每大轮测试生成多个 iter 的产物放到一个目录下。
比如测试 showmap 大轮次测试了三小轮,把三个 iter 轮的数据合并到一个目录里。
📷 图片描述:将三个 iter 轮数据合并到一个目录里的示意。
二. 内存解析工具
下载地址:云盘 mem_parse,下载最新版本。
📷 图片描述:云盘中 mem_parse 文件夹的创建时间(2026-01-13 12:34)及创建者(谢升军)。
当前解析工具仅支持 linux 环境,数据量较大的场景建议在服务器上运行。
0. 环境配置
NDK 配置
ndk 下载地址:https://dl.google.com/android/repository/android-ndk-r29-linux.zip
配置环境变量 vim ~/.bashrc,ANDROID_NDK 设置解压的 ndk 的路径,示例如下:
export ANDROID_NDK="$HOME/bin/android-ndk-r29-linux/android-ndk-r29-linux/android-ndk-r29/"
export PATH="$PATH:$ANDROID_NDK:$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin"source ~/.bashrc 生效环境变量。
Ubuntu 版本需 20 及其以上
python 版本 3.11 以上
如在服务器上可通过以下命令切换 python 版本(不同服务器切换 python 版本方式可能有所不同,如下方式不行需咨询 IT):
source /pub/tools/swtool/env/base.sh
module av python
module load <python版本>📷 图片描述:在服务器上切换 python 版本的命令操作界面。显示在 “mem_tool” 目录下,先执行 “module av python” 命令,列出了多个 python 版本(python/3.8.10、python/3.8.17、python/3.12.4、python/3.12.12 等)。随后执行 “module load python/3.12.12” 命令。
1 . 解析工具使用
./showmap_rss_data --dir1 <设备1内存数据目录> <symbol目录> --dir2 <设备2内存数据目录> <symbol目录> --dir3 <设备3内存数据目录> <symbol目录> --dir4 <设备4内存数据目录> <symbol目录> --dir5 <设备5内存数据目录> <symbol目录> --dir6 <设备5内存数据目录> <symbol目录> -t <内存统计类型> -e <测试场景名> -s <解析数据类型>--dir1第一个设备内存目录和 symbol 目录(必选,作为基准设备),设备内存目录为一.1 抓取工具抓到的内存数据目录;symbol 目录为一.2 symbol 工具抓取的 symbol。--dir2第二个设备内存目录和 symbol 目录(可选,作为对照设备)--dir3第三个设备内存目录和 symbol 目录(可选,作为对照设备)--dir4第四个设备内存目录和 symbol 目录(可选,作为对照设备)--dir5第五个设备内存目录和 symbol 目录(可选,作为对照设备)--dir6第六个设备内存目录和 symbol 目录(可选,作为对照设备)-t解析数据类型,可选 rss,pss-e自定义场景名称(用于 HTML 报告)-s解析数据类型,可选 native,showmap,simpleperf-r选取的 showmap 对比轮次,默认 1。可选 1,2。1 代表选取 gc 之后的 showmap,2 代表 gc 之前的最后一轮 showmap
设备内存数据目录具体到 *_traces_* 目录。
解析 native 堆数据 symbol 目录必填,解析 showmap 数据和 simpleperf 数据时 symbol 目录不填。
使用示例
开机内存解析命令
//解析采集showmap轮次数据
./showmap_rss_data --dir1 systemui_traces_vivo8750 --dir2 systemui_traces_p1 -t rss -e systemui -s showmap
//解析采集simpleperf轮次数据
./showmap_rss_data --dir1 systemui_traces_vivo8750 --dir2 systemui_traces_p1 -t rss -e systemui -s simpleperf
//解析采集native轮次数据
./showmap_rss_data --dir1 systemui_traces_vivo8750 vivo8750_symbol --dir2 systemui_traces_p1 p1_symbol -t rss -e systemui -s native场景内存解析命令
//解析采集showmap轮次数据
./showmap_rss_data_commom --dir1 systemui_traces_vivo8750 --dir2 systemui_traces_p1 -t rss -e systemui -s showmap
//解析采集simpleperf轮次数据
./showmap_rss_data_commom --dir1 systemui_traces_vivo8750 --dir2 systemui_traces_p1 -t rss -e systemui -s simpleperf
//解析采集native轮次数据
./showmap_rss_data_commom --dir1 systemui_traces_vivo8750 vivo8750_symbol--dir2 systemui_traces_p1 p1_symbol -t rss -e systemui -s native注意事项:
- 传入 dir1,dir2,… 的内存数据需要是内存采集工具采集出的内存数据。目录结构如下:
📷 图片描述:解析 showmap 数据和 simpleperf 数据时的 symbol 目录内容。目录下有多个文件夹,如 gfx_data、hprof、log_data 等,其中 “simpleperf_data” 文件夹被红色框突出显示。
2 . 生成产物目录解释
开机内存产物
📷 图片描述:内存解析工具生成产物目录下的文件夹及文件信息。其中
all_iters_peak_rss_comparison.html文件被高亮显示,其创建时间为 2026 年 1 月 16 日 15:32,大小为 1,271 KB,类型为 Chrome HTML Document。
all_iters_peak_rss_comparison.html— 生成的对比报告simpleperf_html— perf.data 生成的火焰图数据hprof— 原始数据的 hprof 数据csv/showmap
📷 图片描述:内存工具生成产物目录下的文件列表。目录路径为 “…/phone_rss_values_phone_traces_SM8850_showmap.csv/“。文件列表中以 “showmap” 命名的文件被红色框突出显示,其大小为 1KB,最后修改时间为 2026-01-13 13:45。
原始的 showmap 数据
fire_html— native 堆采集的内存数据生成的火焰图trace— native 堆采集的内存数据生成的 trace
场景内存产物
📷 图片描述:场景内存产物相关文件及文件夹。其中有 csv、fire_html、hprof 等文件夹,创建时间均为 2026 年 2 月 4 日 19:39。还有 before_rss_comparison.html、max_rss_comparison.html、still5_rss_comparison.html、still30_rss_comparison.html 等文件,创建时间为 2026 年 2 月 4 日 19:58。
场景内存和开机内存不同是场景内存会有四个采集对比点:before 点是测试之前的采集点,max 点是测试过程的内存峰值点,still5 是前台静置 5s 点,still30 是后台静置 30s 点。
before_rss_comparison.html— 测试开始点的内存数据详情
📷 图片描述:“分类别内存 RSS 差值对比表”,分析不同线程、类、方法、类名、Native、文件页、其他等类别在内存 RSS 方面的差异。表格列出了 “phone_traces_xiaomi01” 和 “phone_traces_cibs” 两个对比对象的内存 RSS 数值。
max_rss_comparison.html— 测试过程中内存峰值点的内存数据详情
下表代表 max 点 showmap 详情:
📷 图片描述:“分类别内存 RSS 差值对比表”,包含线程数、匿名 Java、匿名 Native、匿名其他、文件页、其他等类别,以及 phone_traces_xiaomiO1、phone_traces_o2s 等对比数据。如匿名 Java 类别 phone_traces_xiaomiO1 为 40140,phone_traces_o2s 为 40788,差值为 648。
下表代表 max 点相对于 before 点的 showmap 增量:
📷 图片描述:内存增量对比表,包含线程数、类名页 Java、类名页 Native、类名页其他、文件页、其他等类别,以及 phone_traces_xiaomi01_count、phone_traces_o2s_count 等数据项。其中 phone_traces_xiaomi01_count 为 572,phone_traces_o2s_count 为 440,差值为 -132。
如果是 native 堆采集数据,会有 native 堆详细拆解表:
📷 图片描述:场景内存产物中 native 堆采集数据的 Native 堆拆解内容。包含库维度对比(单位:KB)和函数维度对比(单位:KB)两个部分。库维度对比显示不同库的内存占用(如 libsystem_pthread、libsystem_c 等);函数维度对比展示不同函数的内存占用。
still5_rss_comparison.html— 前台静置 5s 的内存数据详情still30_rss_comparison.html— 后台静置 30s 的内存数据详情
其他数据和开机内存数据类似。
FAQ:
- 抓取 simpleperf 轮次内存时,simpleperf 报错 OOM,此时需要重启手机,然后调小
--simple_buf。
📷 图片描述:在 Linux 系统中使用 simpleperf 抓取轮次内存时出现 OOM 错误的命令行界面。关键信息是 “Simpleperf STDERR: failed for perf_event_file(event mm_page_alloc, tid 1711, cpu 2): Out of memory”,表明在执行 perf_event_file 操作时因内存不足导致失败。
附录:工具下载(已转存自有文件床)
网盘
kpan.mioffice.cn(密码869f)里的工具已全部镜像到自有文件床,可直接下载。完整清单(66 文件 / 全版本 / 全平台)见 附件下载索引.md。本文档核心工具直链(最新版 catch_1_0_4 / showmap_parse_1_0_4):
| 工具 | 平台 | 大小 | 下载 |
|---|---|---|---|
start.exe(采集 start appdump) | Windows | 79M | 下载 |
collect_libs.exe(symbol 采集) | Windows | 9M | 下载 |
mem_use | Windows | 7M | 下载 |
start(采集) | Linux ubuntu24 | 51M | 下载 |
collect_libs(symbol) | Linux ubuntu24 | 7M | 下载 |
showmap_rss_data(开机解析) | Linux ubuntu24 | 170M | 下载 |
showmap_rss_data_commom(场景解析) | Linux ubuntu24 | 108M | 下载 |
libGLES_mali.so(O2S 替换库) | — | 97M | 下载 |
📦 全部 66 文件(catch_1_0_0 ~ 1_0_4 全版本、Windows/Linux、smap_process 等):见 附件下载索引.md 🔗 网盘原链(备份,含未镜像的依赖库/旧版本完整包):https://kpan.mioffice.cn/webfolder/ext/H507l6zdDJX$uVm31GQvyw@@ | 密码
869f






按回车继续下次测试


















