如何用Bash的Grep匹配模式计算Android应用的平均内存占用
实现Android应用多次内存采样并计算平均值
嘿,既然你已经能提取单次内存占用的数值了,那咱们把这个逻辑扩展成多次采样求平均的脚本就很简单啦!我给你写个完整的bash脚本示例,直接能用,还能根据你的需求调整参数:
#!/bin/bash # 配置参数,你可以根据需要修改 PACKAGE_NAME="org.carleton.iot.mobile_cep" # 目标应用包名 SAMPLE_COUNT=10 # 采样次数 SAMPLE_INTERVAL=2 # 每次采样间隔(秒) # 初始化变量 total_memory=0 valid_samples=0 echo "开始对应用 $PACKAGE_NAME 进行 $SAMPLE_COUNT 次内存采样..." for ((i=1; i<=SAMPLE_COUNT; i++)); do echo "正在进行第 $i 次采样..." # 执行adb命令并提取内存数值 mem_output=$(adb shell dumpsys meminfo | grep "$PACKAGE_NAME") # 提取数值部分(比如从"233,328K: org.carleton..."中拿到233,328K) mem_value=$(echo "$mem_output" | awk '{print $1}') # 检查是否成功提取到数值 if [[ -n "$mem_value" && "$mem_value" =~ ^[0-9,]+K$ ]]; then # 去掉逗号和K,转换成纯数字方便计算 mem_num=$(echo "$mem_value" | tr -d ',K') total_memory=$((total_memory + mem_num)) valid_samples=$((valid_samples + 1)) echo "第 $i 次采样结果:$mem_value" else echo "警告:第 $i 次采样失败,未获取到有效内存数据" fi # 最后一次采样不需要等待间隔 if [[ $i -lt $SAMPLE_COUNT ]]; then sleep $SAMPLE_INTERVAL fi done # 计算并输出平均值 if [[ $valid_samples -gt 0 ]]; then avg_num=$((total_memory / valid_samples)) # 把数字转成带逗号和K的格式(比如233328 → 233,328K) avg_value=$(echo "$avg_num" | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"K" echo -e "\n采样完成!有效采样次数:$valid_samples" echo "平均内存占用:$avg_value" else echo -e "\n错误:未获取到任何有效内存数据,请检查adb连接和应用包名" fi
使用步骤
- 把上面的代码保存成
mem_avg.sh文件 - 给脚本添加执行权限:
chmod +x mem_avg.sh - 确保你的Android设备已经通过adb连接(执行
adb devices确认设备在线) - 运行脚本:
./mem_avg.sh
小提示
- 如果你已经有自己的数值提取脚本,可以直接替换掉代码中提取
mem_value的部分,调用你的脚本获取数值即可 - 采样间隔和次数可以按需调整:比如测试长时间内存波动,就把间隔设大、次数加多;测试短时间内的内存稳定性,就缩小间隔
- 如果adb连接不稳定,可以在采样失败的分支里加个重试逻辑,比如重新执行一次adb命令
内容的提问来源于stack exchange,提问作者Amarjit Dhillon
相关产品推荐
相关产品推荐

