安卓性能测试通常围绕 启动速度、流畅度、内存、CPU、功耗、网络、稳定性、安装包体积 等方面展开。可以分为 手工分析 + 自动化压测 + 线上监控 三部分。
一、性能测试关注哪些指标?
1. 启动性能
常见指标:
| 指标 | 说明 |
|---|---|
| 冷启动时间 | App 进程不存在,从点击图标到首页可交互 |
| 热启动时间 | App 已在后台,再次打开 |
| 温启动时间 | 进程存在但 Activity 被销毁 |
| 首帧时间 | 第一帧绘制出来的时间 |
| 可交互时间 | 用户真正可以操作的时间 |
常用命令:
adb shell am start -W 包名/启动Activity
示例:
adb shell am start -W com.example.demo/.MainActivity
输出中关注:
ThisTime: 500
TotalTime: 800
WaitTime: 850
一般更关注 TotalTime。
2. 页面流畅度 / FPS / 卡顿
关注:
| 指标 | 说明 |
|---|---|
| FPS | 每秒帧数,理想接近 60 或 120 |
| 掉帧 | 没有在规定时间内完成绘制 |
| 卡顿 | 连续掉帧导致视觉不流畅 |
| Jank | Android 中对卡顿帧的描述 |
常用工具:
- Android Studio Profiler
- Perfetto
- Systrace
- SurfaceFlinger
- FrameMetrics
- 腾讯 Matrix
- Android Vitals
常用命令:
adb shell dumpsys gfxinfo 包名
例如:
adb shell dumpsys gfxinfo com.example.demo
可以查看:
Janky frames
50th percentile
90th percentile
95th percentile
Number Missed Vsync
清空历史数据:
adb shell dumpsys gfxinfo 包名 reset
3. CPU 性能
关注:
| 指标 | 说明 |
|---|---|
| CPU 使用率 | App 是否长期占用过高 CPU |
| 主线程耗时 | UI 线程是否被阻塞 |
| 线程数量 | 是否存在异常线程增长 |
| 方法耗时 | 哪些方法执行慢 |
常用命令:
adb shell top
查看指定包:
adb shell top | grep 包名
或者:
adb shell pidof 包名
adb shell top -p PID
Android Studio Profiler 可以查看:
- CPU Usage
- Call Trace
- Method Trace
- System Trace
4. 内存性能
关注:
| 指标 | 说明 |
|---|---|
| PSS | 实际占用物理内存,更常用 |
| Java Heap | Java/Kotlin 对象内存 |
| Native Heap | C/C++、Bitmap、So 等占用 |
| 内存泄漏 | Activity、Fragment、Context 未释放 |
| GC 频率 | 频繁 GC 会造成卡顿 |
| OOM | 内存溢出崩溃 |
常用命令:
adb shell dumpsys meminfo 包名
示例:
adb shell dumpsys meminfo com.example.demo
重点关注:
TOTAL PSS
Native Heap
Dalvik Heap
Graphics
内存泄漏检测工具:
- LeakCanary
- Android Studio Memory Profiler
- MAT
- Perfetto
5. 功耗测试
关注:
| 指标 | 说明 |
|---|---|
| CPU 唤醒 | 是否频繁唤醒 |
| 网络请求 | 是否后台频繁请求 |
| GPS | 是否持续定位 |
| WakeLock | 是否未释放 |
| 蓝牙 / Wi-Fi / 传感器 | 是否异常使用 |
常用工具:
- Battery Historian
- Android Studio Energy Profiler
- Perfetto
- 厂商功耗测试工具
命令:
adb shell dumpsys batterystats --reset
执行测试场景后:
adb bugreport bugreport.zip
然后用 Battery Historian 分析。
6. 网络性能
关注:
| 指标 | 说明 |
|---|---|
| 请求耗时 | DNS、连接、SSL、首包、下载 |
| 请求成功率 | 是否有大量失败 |
| 流量消耗 | 是否有重复请求、大包传输 |
| 弱网表现 | 2G/3G/高延迟/丢包 |
| 缓存策略 | 是否合理使用缓存 |
常用工具:
- Charles
- Fiddler
- Wireshark
- Android Studio Network Profiler
- OkHttp EventListener
- Network Profiler
弱网模拟:
adb shell network delay
也可以使用:
- Charles Throttle Settings
- Clumsy
- Linux
tc - Android Emulator 网络设置
7. 稳定性测试
关注:
| 指标 | 说明 |
|---|---|
| Crash | 崩溃 |
| ANR | 应用无响应 |
| OOM | 内存溢出 |
| 黑白屏 | 页面无法正常展示 |
| 长时间运行异常 | 内存泄漏、线程泄漏、句柄泄漏 |
常用 Monkey:
adb shell monkey -p 包名 -v 10000
更完整示例:
adb shell monkey \
-p com.example.demo \
--throttle 300 \
--ignore-crashes \
--ignore-timeouts \
--ignore-security-exceptions \
-v -v -v 10000
查看崩溃日志:
adb logcat
或者:
adb logcat | grep -i "FATAL EXCEPTION"
ANR 日志:
adb shell ls /data/anr
adb shell cat /data/anr/traces.txt
二、常用性能测试工具
1. Android Studio Profiler
适合开发调试阶段使用。
可以分析:
- CPU
- Memory
- Network
- Energy
优点是使用简单、图形化。
2. Perfetto
Google 推荐的新一代性能分析工具,适合分析:
- 启动耗时
- 卡顿
- CPU 调度
- 线程阻塞
- Binder 调用
- I/O
- Choreographer
- SurfaceFlinger
官网:
https://ui.perfetto.dev/
常用流程:
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
然后上传到 Perfetto UI 分析。
3. Systrace
老一些,但仍然常见。
用于分析:
- UI 卡顿
- CPU 调度
- View 绘制
- Input 延迟
- GC
4. LeakCanary
用于检测内存泄漏。
集成后可以自动检测:
- Activity 泄漏
- Fragment 泄漏
- ViewModel 泄漏
- Context 泄漏
5. Matrix
腾讯开源性能监控框架。
可以监控:
- 卡顿
- 启动耗时
- IO
- SQLite
- 内存
- APK 体积
三、性能测试基本流程
第一步:确定测试目标
例如:
首页冷启动小于 1500ms
列表滑动 FPS 大于 55
页面切换无明显卡顿
内存峰值小于 300MB
Monkey 运行 8 小时无 Crash、ANR
第二步:准备测试环境
需要统一:
- 手机型号
- Android 系统版本
- App 版本
- 网络环境
- 电量状态
- 是否插电
- 后台进程情况
- 屏幕亮度
- 测试账号和数据
建议:
adb shell pm clear 包名
adb shell am force-stop 包名
测试前尽量保持环境一致。
第三步:设计测试场景
常见场景:
- App 冷启动
- 登录流程
- 首页加载
- 列表滑动
- 图片浏览
- 视频播放
- 页面跳转
- 搜索
- 支付流程
- 后台切前台
- 长时间运行
- 弱网环境
- 大数据量场景
第四步:采集数据
可以通过:
- adb 命令
- Android Studio Profiler
- Perfetto
- 自动化脚本
- 埋点日志
- 线上性能平台
例如采集启动时间:
for i in {1..10}
do
adb shell am force-stop com.example.demo
adb shell am start -W com.example.demo/.MainActivity
sleep 3
done
多测几次,去掉异常值,取平均值、P90、P95。
第五步:分析问题
常见分析方向:
启动慢
可能原因:
- Application 初始化过多
- 主线程做 I/O
- 主线程网络请求
- 初始化 SDK 太多
- 首页布局复杂
- 首屏接口慢
- 冷启动加载资源过大
优化方向:
- 延迟初始化
- 异步初始化
- 拆分启动任务
- 启动器框架
- 减少首屏布局层级
- 使用懒加载
- 减少主线程 I/O
页面卡顿
可能原因:
- 主线程耗时任务
- RecyclerView 绑定数据慢
- 图片加载过大
- 布局层级复杂
- 频繁 GC
- 过度绘制
- 动画计算复杂
优化方向:
- 主线程只做 UI 操作
- DiffUtil 优化列表刷新
- RecyclerView 复用优化
- 图片压缩和缓存
- ConstraintLayout 减少层级
- 避免频繁创建对象
- 减少 overdraw
内存过高
可能原因:
- Bitmap 未释放或过大
- Activity 泄漏
- 静态变量持有 Context
- Handler 延迟消息未清理
- 注册监听未反注册
- 缓存无限增长
优化方向:
- 使用 LeakCanary
- 图片按需加载
- LruCache 限制缓存
- 生命周期内释放资源
- 避免静态持有 View/Context
四、常用 adb 命令汇总
查看启动时间
adb shell am start -W 包名/Activity名
查看内存
adb shell dumpsys meminfo 包名
查看 FPS 和卡顿
adb shell dumpsys gfxinfo 包名
查看 CPU
adb shell top
查看进程 PID
adb shell pidof 包名
查看电量统计
adb shell dumpsys batterystats
清除电量统计
adb shell dumpsys batterystats --reset
抓取日志
adb logcat
停止应用
adb shell am force-stop 包名
清除应用数据
adb shell pm clear 包名
Monkey 压测
adb shell monkey -p 包名 -v 10000
五、性能测试报告应该包含什么?
一份完整的性能测试报告建议包含:
- 测试背景
- 测试版本
- 测试设备
- Android 系统版本
- 网络环境
- 测试场景
- 测试方法
- 测试数据
- 对比基线
- 问题列表
- 复现步骤
- 日志或 trace 附件
- 优化建议
- 结论
示例:
| 场景 | 指标 | 结果 | 标准 | 是否通过 |
|---|---|---|---|---|
| 冷启动 | TotalTime | 1800ms | <1500ms | 不通过 |
| 首页滑动 | FPS | 52 | >55 | 不通过 |
| 详情页 | PSS | 280MB | <300MB | 通过 |
| Monkey 2小时 | Crash | 0 | 0 | 通过 |
六、推荐的性能测试落地方案
如果是团队项目,可以这样做:
开发阶段
- Android Studio Profiler
- LeakCanary
- StrictMode
- 本地启动耗时日志
- 本地卡顿检测
测试阶段
- adb 脚本采集启动、内存、FPS
- Monkey 稳定性测试
- 弱网测试
- Perfetto 分析重点卡顿场景
发布前
- 对比上一个版本性能数据
- 启动时间、内存、FPS、Crash、ANR 必测
- 多机型覆盖:低端机、中端机、高端机
线上阶段
- 接入性能监控平台
- 监控启动、卡顿、Crash、ANR、内存、网络
- 按机型、系统版本、地区分析问题
七、简单总结
安卓性能测试可以按照下面这条主线做:
确定指标 → 设计场景 → 准备设备 → 执行测试 → 采集数据 → 分析瓶颈 → 输出报告 → 优化回归
重点关注:
启动是否快
页面是否流畅
内存是否稳定
CPU 是否异常
功耗是否过高
网络是否合理
长时间运行是否稳定
如果你刚开始做,建议先从这几个命令入手:
adb shell am start -W 包名/Activity
adb shell dumpsys meminfo 包名
adb shell dumpsys gfxinfo 包名
adb shell top
adb shell monkey -p 包名 -v 10000
这些基本就能覆盖 Android 性能测试的入门核心场景。