如何自动化测试Android应用运行1小时后的内存使用情况?
嘿,我正好做过类似的自动化内存测试,给你分享几个实用的方案,解决你用systrace看不到最大最小内存的问题:
方案一:ADB + 自定义脚本(最轻量化)
这个方案不需要额外工具,用Android自带的ADB命令就能实现定时采集,最后统计最大最小值。核心是用adb shell dumpsys meminfo获取应用内存数据,再用脚本循环采集1小时。
步骤:
- 准备一个bash脚本(Windows可以用Git Bash或者PowerShell改写):
#!/bin/bash # 替换成你的应用包名 PACKAGE_NAME="com.your.app" # 每10秒采集一次(可调整) INTERVAL=10 # 总时长1小时=3600秒 TOTAL_DURATION=3600 OUTPUT_FILE="memory_logs.csv" # 初始化CSV表头 echo "时间戳,PSS(KB),私有脏内存(KB)" > $OUTPUT_FILE # 计算采集次数 ITERATIONS=$((TOTAL_DURATION / INTERVAL)) # 先启动应用(可选,确保应用在前台) adb shell monkey -p $PACKAGE_NAME -c android.intent.category.LAUNCHER 1 sleep 5 # 等待应用启动稳定 for ((i=0; i<ITERATIONS; i++)) do TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") # 提取内存数据(适配大多数Android版本) MEM_DATA=$(adb shell dumpsys meminfo $PACKAGE_NAME | grep -A1 "TOTAL") PSS=$(echo "$MEM_DATA" | awk '/TOTAL/ {print $2}') PRIVATE_DIRTY=$(echo "$MEM_DATA" | awk '/Private Dirty/ {print $2}') # 写入日志 echo "$TIMESTAMP,$PSS,$PRIVATE_DIRTY" >> $OUTPUT_FILE sleep $INTERVAL done # 统计最大最小值 echo "=== 1小时内存统计结果 ===" echo "PSS最大值: $(awk -F ',' '{if(NR>1) print $2}' $OUTPUT_FILE | sort -n | tail -1) KB" echo "PSS最小值: $(awk -F ',' '{if(NR>1) print $2}' $OUTPUT_FILE | sort -n | head -1) KB" echo "私有脏内存最大值: $(awk -F ',' '{if(NR>1) print $3}' $OUTPUT_FILE | sort -n | tail -1) KB" echo "私有脏内存最小值: $(awk -F ',' '{if(NR>1) print $3}' $OUTPUT_FILE | sort -n | head -1) KB"
- 给脚本加执行权限:
chmod +x memory_test.sh - 确保设备/模拟器通过ADB连接正常,运行脚本即可。
注意:
- *PSS(Proportional Set Size)*是最推荐的内存指标,它能准确反映应用实际占用的物理内存(考虑了共享内存的分摊)。
- 不同Android版本的
dumpsys meminfo输出格式可能略有差异,若提取不到数据,可调整grep和awk的匹配规则。
方案二:Android Studio Profiler 命令行自动化
如果你需要更详细的内存变化曲线,同时要自动化,可以用Profiler的命令行工具profiler-cli来录制1小时的内存数据,之后分析最大最小值。
操作步骤:
- 确保Android Studio的
bin目录在系统PATH里,或者直接用全路径调用profiler-cli。 - 启动内存录制:
# 录制指定应用的内存数据,持续3600秒,输出到trace文件 profiler-cli record --memory --duration 3600 --output app_memory.trace com.your.app
- 录制完成后,你可以:
- 用Android Studio打开
app_memory.trace,直观查看内存波动,手动找到最大最小值; - 用Python脚本解析trace文件(trace是基于protobuf的格式),自动提取统计数据。
- 用Android Studio打开
方案三:Docker + 模拟器(CI/CD场景)
如果需要在持续集成环境中自动化运行测试,可以用Docker打包Android模拟器环境,实现无界面测试。
大致流程:
- 拉取带模拟器的Docker镜像(比如第三方维护的镜像):
docker pull budtmo/docker-android:emulator_33
- 启动容器并映射ADB端口:
docker run -d -p 5555:5555 --name android-emulator budtmo/docker-android:emulator_33
- 连接容器内的模拟器:
adb connect localhost:5555
- 之后就可以复用方案一的脚本,在容器内完成1小时的内存采集和统计。
额外优化:
如果要模拟真实用户操作(比如滑动、点击),可以在脚本中加入adb shell input命令,比如:
# 每隔30秒模拟一次屏幕滑动 adb shell input swipe 500 1500 500 500
内容的提问来源于stack exchange,提问作者scll
相关产品推荐
相关产品推荐

