内存工具-开机/典型场景工具使用指导
工具下载地址: 地址:https://kpan.mioffice.cn/webfolder/ext/H507l6zdDJX%24uVm31GQvyw%40%40 密码: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目录下

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,选择最新版本下载

如果是ubuntu环境,根据ubuntu版本选择工具

使用命令
//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
设置mem_use 的事件buffer大小,默认512,观察到event lost count较高时说明有事件丢失,需要调大 - -B
设置mem_use 的回栈信息buffer 1大小, 默认128,观察到stack lost count较高时说明有回栈信息丢失,需要调大 - -a 设置mem_use的回栈信息buffer 2大小, 默认256,可选256,512,768,968,1024,同-B类似,观察到stack lost count较高时需要调大。
- —mem_time mem_use的抓取时间(单位ms)
- —simpleperf 是否抓取simpleperf
- —simple_buf simpleperf的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
//抓取simpleper参数
//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工具
下载地址:


采集symbol工具支持linux和windows环境
当进行native堆测试时需要抓取symbol,其他测试不用抓
使用方法:
//获取应用的进程名
adb shell ps -ef | grep 进程名
//进程号为要采集进程的进程号
//linux
./collect_libs --pid <进程号> --pull <symbol输出目录>
//windows
.\collect_libs.exe --pid <进程号> --pull <symbol输出目录>参数解释:
- —pid 采集进程进程号(必填)
- —pull symbol输出目录(必填)
- —adb-path adb 路径(可选),如在wsl 环境需填,例如:/mnt/d/Tools/platform-tools/adb.exe
3. 测试流程
3.1 开机场景测试流程
- 输入测试命令

- 等rss稳定后按回车暂停,一次不行,按两次回车

- 按回车继续下次测试

3.2 通用场景测试流程
- 输入测试命令等待操作开始起点,在看到”请按Enter键后开始操作APP”后按回车开始测试

- 测试操作结束后按回车结束测试,前台静止5s,同步采集数据

- 进程进入后台,采集后台静止30s数据

- 按回车继续下次测试

3.3 symbol 符号表抓取
当进行native堆测试时需要抓取symbol,其他测试不用抓
用symbol工具抓取symbol,只要系统版本不变,每个进程只需要抓取一次symbol数据
注意事项
在开机测试场景和通用场景测试场景中,
抓取simpleperf测试时关注丢失率,Samples lost/Samples recorded 不超过1%,如果超1%,需要调大—simple_buf参数。

抓取native堆测试时关注stack lost率和event lost率,如超5%,调大 -B 256 -a 512

4. 生成产物
- 产物目录

产物解释:
- gfx_data gfx_info的信息
- hprof 测试结束抓到的hprof信息
- showmap_data showmap数据
- meminfo_info dumpsys meminfo数据
- log_data native抓取过程中log数据
- mem_use_data, memuse_filename_data, stack1_data, stack2_data native堆内存数据
- simpleperf_data simpleperf抓取的perf数据
- traces perfetto trace数据
注意事项:
(1)抓取native堆轮次需要确保mem_use_data, memuse_filename_data, stack1_data, stack2_data,log_data目录有产物且文件不为空
(2)抓取 simpleperf轮次需要确保simpleperf_data目录有产物且文件不为空
- 每个设备的每大轮测试生成多个iter的产物放到一个目录下
比如测试showmap大轮次测试了三小轮
把三个iter轮的数据合并到一个目录里

二. 内存解析工具
下载地址:云盘mem_parse,下载最新版本

当前解析工具仅支持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版本>
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,…的内存数据需要是内存采集工具采集出的内存数据
目录结构如下

2. 生成产物目录解释
开机内存产物

- all_iters_peak_rss_comparison.html
生成的对比报告
- simpleperf_html
perf.data生成的火焰图数据
- hprof
原始数据的hprof数据
- csv/showmap

原始的showmap数据
- fire_html
native堆采集的内存数据生成的火焰图
- trace
native堆采集的内存数据生成的trace
场景内存产物

场景内存和开机内存不同是场景内存会有四个采集对比点,before点是测试之前的采集点,max点是测试过程的内存峰值点,still5是前台静置5s点,still30是后台静置30s点
- before_rss_comparison.html
测试开始点的内存数据详情

- max_rss_comparison.html
测试过程中内存峰值点的内存数据详情
下表代表max点showmap详情

下表代表max点相对于before点的showmap 增量

如果是native堆采集数据,会有native堆详细拆解表

- still5_rss_comparison.html
前台静置5s 的内存数据详情
- still30_rss_comparison.html
后台静置30s的内存数据详情
其他数据和开机内存数据类似。
FAQ:
- 抓取simpleperf轮次内存时,simpleperf报错OOM,此时需要 重启手机,然后调小 —simple_buf
