解放双手!3小时Android极限压力测试,一个脚本自动搞定

我始终认为,对于系统开发者和深度测试人员来说,时间是最宝贵的。一遍遍手动执行不同的压力测试工具,监控日志,截图记录状态,不仅是体力活,更难以模拟真实、复杂且并发的极端场景。每次想全面评估一次系统服务的健壮性、内存泄漏或并发处理能力,都要搭建一次环境,这个过程本身就让人疲惫。

所以,我花时间封装了一个一键式的自动化脚本,它集成了多种主流测试工具,能自动完成设备状态备份、并发压力测试、全链路监控和数据收集。你只需要连接设备,执行一条命令,就可以去喝杯咖啡,3小时后回来查看完整的测试报告和所有原始数据。

这个脚本的核心思路很清晰:“并发生威,监控到底,数据说话”。它不会只跑单一测试,而是让Fastbot的随机探索、Maxim的深度遍历、自定义的暴力场景以及底层的Binder调用压力同时进行,最大限度地对系统施加复合压力。同时,Perfetto会像黑匣子一样全程记录,任何异常的内存增长、卡顿或进程异常都无所遁形。

一切从一个Bash脚本开始。我们把它保存为 auto_system_stress.sh

#!/bin/bash
# auto_system_stress.sh
# 一键运行所有压力测试


开篇,脚本首先检查你的ADB连接是否就绪,这是所有后续操作的基础。它还会获取设备的基本信息,为后续的报告提供上下文。

echo "=== Android系统压力测试套件 ==="
if ! adb devices | grep -q "device$"; then
    echo “错误:未找到已连接的Android设备”
    exit 1
fi
DEVICE=$(adb shell getprop ro.product.model)
ANDROID_VERSION=$(adb shell getprop ro.build.version.release)
echo “设备: $DEVICE”
echo “Android版本: $ANDROID_VERSION”
echo “”


接着,它会创建一个按时间戳命名的专属目录,所有日志、截图、内存快照和跟踪文件都会井然有序地存放在这里,彻底告别文件杂乱。

TEST_DIR=“./system_stress_test_$(date +%Y%m%d_%H%M%S)”
mkdir -p “$TEST_DIR”
cd “$TEST_DIR” || exit
mkdir -p {logs,traces,screenshots,memory_dumps}


在“施压”之前,必须先记录系统的“健康状态”。脚本会备份初始的内存信息(dumpsys meminfo/proc/meminfo)和进程状态(top),为测试前后的对比分析打下基础。

echo “备份系统状态...”
adb shell dumpsys meminfo > logs/initial_memory.txt
adb shell cat /proc/meminfo > logs/initial_proc_meminfo.txt
adb shell top -b -n 1 > logs/initial_top.txt


接下来是启动我们的“黑匣子”——Perfetto系统追踪。这里我们配置它抓取内存信息和进程状态,并持续运行3小时。这个跟踪文件是后续性能分析的宝藏。

echo “启动Perfetto监控...”
adb shell perfetto --background \
  -c - --txt -o /data/local/tmp/trace.perfetto-trace << ‘EOF’
buffers: { size_kb: 100000 }
data_sources: {
  config {
    name: “android.meminfo”
    meminfo_config { poll_ms: 1000 }
  }
}
data_sources: {
  config {
    name: “linux.process_stats”
    process_stats_config { proc_stats_poll_ms: 2000 }
  }
}
duration_ms: 10800000  # 3小时
EOF


重头戏来了:四大测试任务被同时启动,在后台并发执行。Fastbot进行智能GUI探索,Maxim进行深度遍历并可能捕获堆转储,我们自定义的system_ui_storm.sh脚本模拟高强度操作,而Binder压力测试则直接冲击系统通信的底层。这种多管齐下的方式,极易暴露那些在单一测试下隐藏极深的问题。

echo “开始运行测试套件...”
echo “[1/4] Fastbot智能探索测试...”
adb shell CLASSPATH=/data/local/tmp/fastbot.jar \
  app_process /system/bin com.bytedance.fastbot.Main \
  --pkg-name com.android.systemui \
  --running-minutes 30 \
  --throttle 300 \
  --output-directory /sdcard/fastbot_out/ \
  > logs/fastbot.log 2>&1 &
echo “[2/4] Maxim深度测试...”
adb shell CLASSPATH=/data/local/tmp/maxim.jar \
  exec app_process /system/bin com.android.commands.monkey.Monkey \
  -p com.android.systemui \
  --uiautomatormix \
  --running-minutes 30 \
  --hprof 1 \
  --ignore-crashes \
  > logs/maxim.log 2>&1 &
echo “[3/4] 自定义暴力测试...”
chmod +x ../system_ui_storm.sh
../system_ui_storm.sh > logs/custom_stress.log 2>&1 &
echo “[4/4] Binder压力测试...”
adb shell /data/local/tmp/binder_stress_test \
  > logs/binder_stress.log 2>&1 &

 

在接下来的3小时里,脚本并非简单地等待。它会每分钟记录一次系统服务的内存快照和屏幕截图,让你能清晰地回溯到问题发生的确切时间点,观察屏幕上的异常状态。

echo “所有测试已启动,监控进度...”
for i in {1..180}; do
    echo “进度: $i/180 分钟”
    adb shell dumpsys meminfo system_server \
      > “memory_dumps/mem_$(printf “%03d” $i).txt”
    adb exec-out screencap -p > “screenshots/screen_$(printf “%03d” $i).png”
    sleep 60
done

 

测试时间一到,脚本开始善后工作:停止追踪、拉取各工具生成的详细日志和结果、收集最终的系统和内核日志。最后,它会自动生成一份Markdown格式的测试报告,里面包含设备信息、测试时间以及最关键的内存变化对比,为你提供第一时间的结论。

echo “测试完成,收集结果...”
adb shell killall perfetto
adb pull /sdcard/fastbot_out/ ./fastbot_results/
adb pull /sdcard/maxim_logs/ ./maxim_results/
adb pull /data/local/tmp/trace.perfetto-trace ./traces/full_trace.perfetto-trace
adb shell dumpsys meminfo > logs/final_memory.txt
adb logcat -d > logs/full_logcat.txt
adb shell dmesg > logs/full_dmesg.txt
cat > report.md << EOF
# 系统压力测试报告
## 测试信息
- 设备: $DEVICE
- Android版本: $ANDROID_VERSION
- 测试时间: $(date)
- 测试时长: 3小时
## 内存变化分析
\`\`\`
初始内存:
$(grep -E “Used RAM:|Free RAM:” logs/initial_memory.txt)
最终内存:
$(grep -E “Used RAM:|Free RAM:” logs/final_memory.txt)
\`\`\`
## 发现的问题
1. 查看 logs/ 目录下的详细日志
2. 使用 chrome://tracing 打开 traces/full_trace.perfetto-trace
3. 检查 screenshots/ 目录的截图序列
## 关键指标
- 系统服务内存增长: TODO
- OOM发生次数: TODO
- 崩溃次数: TODO
EOF
echo “=== 测试完成 ===”
echo “所有结果保存在: $TEST_DIR”
echo “请查看 $TEST_DIR/report.md 获取摘要”


使用这个脚本后,我的测试工作流变得极其高效。一次完整的、深度的高强度测试,从准备到出报告,只需一条命令。它带来的最大价值是可重复性数据完整性。任何偶现的问题,都可以通过重复运行此脚本来尝试复现,并且一旦复现,所有的上下文数据(内存趋势、Trace、截图)都已被完整保存,极大加速了问题定位的进程。你可以根据自己的需要,轻松替换其中的测试工具、调整时长或增加新的监控项,它就是一个强大的自动化测试基座。


完整代码

#!/bin/bash
# auto_system_stress.sh
# 一键运行所有压力测试

echo "=== Android系统压力测试套件 ==="

# 1. 检查设备连接
if ! adb devices | grep -q "device$"; then
    echo "错误:未找到已连接的Android设备"
    exit 1
fi

DEVICE=$(adb shell getprop ro.product.model)
ANDROID_VERSION=$(adb shell getprop ro.build.version.release)
echo "设备: $DEVICE"
echo "Android版本: $ANDROID_VERSION"
echo ""

# 2. 创建测试目录
TEST_DIR="./system_stress_test_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$TEST_DIR"
cd "$TEST_DIR" || exit

mkdir -p {logs,traces,screenshots,memory_dumps}

# 3. 备份当前系统状态
echo "备份系统状态..."
adb shell dumpsys meminfo > logs/initial_memory.txt
adb shell cat /proc/meminfo > logs/initial_proc_meminfo.txt
adb shell top -b -n 1 > logs/initial_top.txt

# 4. 启动监控
echo "启动Perfetto监控..."
adb shell perfetto --background \
  -c - --txt -o /data/local/tmp/trace.perfetto-trace << 'EOF'
buffers: { size_kb: 100000 }
data_sources: {
  config {
    name: "android.meminfo"
    meminfo_config { poll_ms: 1000 }
  }
}
data_sources: {
  config {
    name: "linux.process_stats"
    process_stats_config { proc_stats_poll_ms: 2000 }
  }
}
duration_ms: 10800000  # 3小时
EOF

# 5. 运行测试套件
echo "开始运行测试套件..."

# 测试1: Fastbot智能探索
echo "[1/4] Fastbot智能探索测试..."
adb shell CLASSPATH=/data/local/tmp/fastbot.jar \
  app_process /system/bin com.bytedance.fastbot.Main \
  --pkg-name com.android.systemui \
  --running-minutes 30 \
  --throttle 300 \
  --output-directory /sdcard/fastbot_out/ \
  > logs/fastbot.log 2>&1 &

# 测试2: Maxim深度测试
echo "[2/4] Maxim深度测试..."
adb shell CLASSPATH=/data/local/tmp/maxim.jar \
  exec app_process /system/bin com.android.commands.monkey.Monkey \
  -p com.android.systemui \
  --uiautomatormix \
  --running-minutes 30 \
  --hprof 1 \
  --ignore-crashes \
  > logs/maxim.log 2>&1 &

# 测试3: 自定义暴力测试
echo "[3/4] 自定义暴力测试..."
chmod +x ../system_ui_storm.sh
../system_ui_storm.sh > logs/custom_stress.log 2>&1 &

# 测试4: Binder调用压力测试
echo "[4/4] Binder压力测试..."
adb shell /data/local/tmp/binder_stress_test \
  > logs/binder_stress.log 2>&1 &

# 6. 监控进度
echo "所有测试已启动,监控进度..."
for i in {1..180}; do
    echo "进度: $i/180 分钟"
    adb shell dumpsys meminfo system_server \
      > "memory_dumps/mem_$(printf "%03d" $i).txt"
    adb exec-out screencap -p > "screenshots/screen_$(printf "%03d" $i).png"
    sleep 60
done

# 7. 清理和收集结果
echo "测试完成,收集结果..."
adb shell killall perfetto
adb pull /sdcard/fastbot_out/ ./fastbot_results/
adb pull /sdcard/maxim_logs/ ./maxim_results/
adb pull /data/local/tmp/trace.perfetto-trace ./traces/full_trace.perfetto-trace
adb shell dumpsys meminfo > logs/final_memory.txt
adb logcat -d > logs/full_logcat.txt
adb shell dmesg > logs/full_dmesg.txt

# 8. 生成报告
echo "生成测试报告..."
cat > report.md << EOF
# 系统压力测试报告

## 测试信息
- 设备: $DEVICE
- Android版本: $ANDROID_VERSION
- 测试时间: $(date)
- 测试时长: 3小时

## 内存变化分析
\`\`\`
初始内存:
$(grep -E "Used RAM:|Free RAM:" logs/initial_memory.txt)

最终内存:
$(grep -E "Used RAM:|Free RAM:" logs/final_memory.txt)
\`\`\`

## 发现的问题
1. 查看 logs/ 目录下的详细日志
2. 使用 chrome://tracing 打开 traces/full_trace.perfetto-trace
3. 检查 screenshots/ 目录的截图序列

## 关键指标
- 系统服务内存增长: TODO
- OOM发生次数: TODO
- 崩溃次数: TODO
EOF

echo "=== 测试完成 ==="
echo "所有结果保存在: $TEST_DIR"
echo "请查看 $TEST_DIR/report.md 获取摘要"

 

使用前请注意:

  1. 确保已配置好ADB环境。
  2. 提前将 fastbot.jarmaxim.jarsystem_ui_storm.shbinder_stress_test 等测试工具和二进制文件推送到设备的 /data/local/tmp/ 目录下。
  3. 根据你的测试目标,适当调整脚本中的包名(com.android.systemui)、测试时长等参数。
  4. 这是一次高强度测试,建议在测试机或模拟器上运行,避免影响主力设备。
THE END
喜欢就支持一下吧
赞赏 分享