Files
mkdocs/docs/Google开发文档体系/工具和资源/性能分析工具.md
2026-01-15 18:21:00 +08:00

12 KiB
Raw Blame History

性能分析工具

目录


CPU Profiler

CPU Profiler简介

// CPU Profiler分析应用 CPU 使用情况
// - 记录方法调用
// - 分析性能瓶颈
// - 优化代码性能

打开CPU Profiler

// 方式1View → Tool Windows → Profiler
// 方式2Run → Profile 'app'
// 方式3点击底部 Profiler 标签

记录方法

// 1. Sampled采样
// - 定期采样方法调用
// - 性能开销小
// - 适合长时间记录

// 2. Instrumented插桩
// - 记录每个方法调用
// - 性能开销大
// - 适合短时间记录
// - 提供更详细的信息

使用步骤

// 1. 启动应用
// 2. 在 Profiler 中选择应用进程
// 3. 点击 CPU 时间线
// 4. 选择记录方法Sampled 或 Instrumented
// 5. 点击 Record 按钮
// 6. 执行要分析的操作
// 7. 点击 Stop 按钮
// 8. 分析结果

分析结果

// 1. Call Chart调用图
// - 显示方法调用关系
// - 横向:时间轴
// - 纵向:调用栈深度
// - 颜色:不同线程

// 2. Flame Chart火焰图
// - 显示方法占用时间
// - 横向:方法占用时间比例
// - 纵向:调用栈深度

// 3. Top Down自上而下
// - 从调用者到被调用者
// - 显示方法总时间和自身时间

// 4. Bottom Up自下而上
// - 从被调用者到调用者
// - 显示方法被调用的位置

性能优化建议

// 1. 查找耗时方法
// - 关注自身时间Self Time长的方法
// - 关注总时间Total Time长的方法

// 2. 优化主线程
// - 避免在主线程执行耗时操作
// - 使用后台线程处理耗时任务

// 3. 减少方法调用
// - 减少不必要的循环
// - 优化算法复杂度

// 4. 使用缓存
// - 缓存计算结果
// - 避免重复计算

Memory Profiler

Memory Profiler简介

// Memory Profiler分析应用内存使用情况
// - 查看内存使用趋势
// - 捕获堆转储
// - 查找内存泄漏
// - 分析对象分配

打开Memory Profiler

// 方式1View → Tool Windows → Profiler
// 方式2Run → Profile 'app'

内存使用视图

// 1. 内存使用时间线
// - 显示内存使用趋势
// - 不同颜色表示不同内存类型
// - 可以查看内存峰值

// 2. 内存分配
// - 查看对象分配
// - 分析分配模式
// - 查找内存泄漏

// 3. 堆转储
// - 捕获堆快照
// - 分析对象引用
// - 查找内存泄漏

捕获堆转储

// 1. 启动应用
// 2. 在 Memory Profiler 中选择应用进程
// 3. 执行可能导致内存泄漏的操作
// 4. 点击 Dump Java Heap 按钮
// 5. 等待堆转储完成
// 6. 分析堆转储

分析堆转储

// 1. 按类查看对象
// - 查看每个类的实例数
// - 查看每个类的内存占用

// 2. 按包查看对象
// - 查看每个包的对象数
// - 查找内存占用大的包

// 3. 查看对象引用
// - 查看对象的引用链
// - 查找内存泄漏原因

// 4. 比较堆转储
// - 比较两个时间点的堆转储
// - 查找新增对象
// - 查找内存泄漏

内存泄漏检测

// 1. 使用 LeakCanary
// 自动检测内存泄漏
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'

// 2. 使用 Memory Profiler
// - 捕获堆转储
// - 分析对象引用
// - 查找泄漏原因

// 3. 常见内存泄漏场景
// - Activity 持有 Context 引用
// - 静态变量持有对象引用
// - 监听器未取消注册
// - 内部类持有外部类引用

内存优化建议

// 1. 及时释放资源
// - 关闭文件流
// - 取消注册监听器
// - 释放 Bitmap

// 2. 使用对象池
// - 复用对象
// - 减少对象创建

// 3. 优化图片加载
// - 使用合适的图片尺寸
// - 及时回收 Bitmap
// - 使用图片缓存

// 4. 避免内存泄漏
// - 使用弱引用
// - 及时取消注册
// - 避免静态变量持有 Context

Network Profiler

Network Profiler简介

// Network Profiler分析应用网络请求
// - 监控网络请求
// - 查看请求详情
// - 分析网络性能
// - 优化网络请求

打开Network Profiler

// 方式1View → Tool Windows → Profiler
// 方式2Run → Profile 'app'

网络请求视图

// 1. 网络请求时间线
// - 显示所有网络请求
// - 不同颜色表示不同请求状态
// - 可以查看请求时间

// 2. 请求详情
// - 请求 URL
// - 请求方法
// - 请求头
// - 请求体
// - 响应状态码
// - 响应头
// - 响应体
// - 请求时间

分析网络请求

// 1. 查看请求时间
// - 总时间
// - 连接时间
// - 等待时间
// - 接收时间

// 2. 查看请求大小
// - 请求大小
// - 响应大小
// - 总大小

// 3. 查看请求状态
// - 成功
// - 失败
// - 超时

网络优化建议

// 1. 减少请求次数
// - 合并请求
// - 使用批量接口

// 2. 优化请求大小
// - 压缩请求数据
// - 只请求必要数据

// 3. 使用缓存
// - HTTP 缓存
// - 本地缓存
// - 减少重复请求

// 4. 优化网络库
// - 使用连接池
// - 使用 HTTP/2
// - 使用压缩

Energy Profiler

Energy Profiler简介

// Energy Profiler分析应用电量消耗
// - 监控电量使用
// - 分析电量消耗
// - 查找耗电问题
// - 优化电量使用

打开Energy Profiler

// 方式1View → Tool Windows → Profiler
// 方式2Run → Profile 'app'
// 注意:需要 Android 8.0+ 设备

电量使用视图

// 1. 电量使用时间线
// - 显示电量使用趋势
// - 不同颜色表示不同电量消耗源
// - 可以查看电量峰值

// 2. 电量消耗源
// - CPU
// - 网络
// - GPS
// - 传感器
// - 唤醒锁
// - 屏幕

分析电量消耗

// 1. 查看电量消耗源
// - CPU 使用
// - 网络活动
// - GPS 使用
// - 传感器使用
// - 唤醒锁
// - 屏幕亮度

// 2. 查找耗电问题
// - 长时间 CPU 使用
// - 频繁网络请求
// - GPS 持续定位
// - 传感器持续使用
// - 唤醒锁未释放

电量优化建议

// 1. 优化 CPU 使用
// - 减少后台任务
// - 使用 JobScheduler
// - 使用 WorkManager

// 2. 优化网络请求
// - 减少请求频率
// - 批量请求
// - 使用缓存

// 3. 优化定位
// - 使用低功耗定位
// - 及时停止定位
// - 使用位置缓存

// 4. 优化传感器
// - 及时注销传感器
// - 使用合适的采样率

// 5. 优化唤醒锁
// - 及时释放唤醒锁
// - 使用超时机制

其他性能工具

Systrace

# Systrace系统级性能分析工具

# 1. 安装 Python 和 Systrace
# 2. 开始跟踪
python systrace.py --time=10 -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

# 3. 在设备上执行操作
# 4. 停止跟踪
# 5. 查看 trace.html

# 功能:
# - 分析系统性能
# - 查找系统瓶颈
# - 分析帧率
# - 分析 CPU 调度

GPU Profiler

// GPU Profiler分析 GPU 性能

// 启用方式:
// Settings → Developer Options → Profile GPU Rendering → On screen as bars

// 功能:
// - 分析渲染性能
// - 查找渲染瓶颈
// - 优化 UI 性能

// 指标:
// - 绘制时间
// - 准备时间
// - 处理时间

Hierarchy Viewer

// Hierarchy Viewer查看视图层次和性能
// 已弃用,推荐使用 Layout Inspector

Traceview

// Traceview方法级性能分析工具
// 已弃用,推荐使用 CPU Profiler

MATMemory Analyzer Tool

// MAT内存分析工具
// - 分析堆转储文件
// - 查找内存泄漏
// - 分析内存使用

// 使用步骤:
// 1. 在 Memory Profiler 中导出堆转储
// 2. 在 MAT 中打开堆转储文件
// 3. 分析内存使用

LeakCanary

// LeakCanary内存泄漏检测工具

// 1. 添加依赖
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

// 2. 自动集成(无需代码)
// LeakCanary 会自动检测内存泄漏
// 当检测到泄漏时,会显示通知

// 3. 查看泄漏报告
// 点击通知查看详细泄漏信息

BlockCanary

// BlockCanary主线程阻塞检测工具

// 1. 添加依赖
dependencies {
    implementation 'com.github.markzhai:blockcanary-android:1.5.0'
}

// 2. 初始化
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        BlockCanary.install(this, new AppBlockCanaryContext()).start();
    }
}

// 3. 自动检测主线程阻塞
// 当检测到阻塞时,会显示通知

性能分析流程

1. 确定性能问题

// 1. 用户反馈
// - 应用卡顿
// - 启动慢
// - 内存占用高
// - 耗电快

// 2. 性能指标
// - 启动时间
// - 帧率
// - 内存使用
// - 电量消耗

2. 选择分析工具

// 根据问题类型选择工具:
// - CPU 问题 → CPU Profiler
// - 内存问题 → Memory Profiler
// - 网络问题 → Network Profiler
// - 电量问题 → Energy Profiler
// - 系统问题 → Systrace

3. 记录和分析

// 1. 启动 Profiler
// 2. 执行问题场景
// 3. 记录数据
// 4. 分析结果
// 5. 查找问题原因

4. 优化和验证

// 1. 实施优化
// 2. 重新测试
// 3. 验证效果
// 4. 持续监控

常见问题

问题1Profiler无法启动

// 解决方案:
// 1. 确保设备运行 Android 5.0+
// 2. 检查应用是否正在运行
// 3. 检查设备连接
// 4. 重启 Android Studio
// 5. 检查 Profiler 插件是否启用

问题2CPU Profiler数据不准确

// 解决方案:
// 1. 使用 Instrumented 模式获得更准确数据
// 2. 确保记录时间足够长
// 3. 多次记录取平均值
// 4. 关闭其他应用

问题3Memory Profiler无法捕获堆转储

// 解决方案:
// 1. 确保应用正在运行
// 2. 等待应用稳定
// 3. 检查设备内存是否充足
// 4. 重启应用

问题4Network Profiler不显示请求

// 解决方案:
// 1. 确保使用 HTTP/HTTPS 协议
// 2. 检查网络库是否支持
// 3. 确保应用正在运行
// 4. 检查网络权限

问题5Energy Profiler数据不准确

// 解决方案:
// 1. 确保设备运行 Android 8.0+
// 2. 等待足够长时间
// 3. 关闭其他应用
// 4. 确保设备电量充足

性能分析最佳实践

1. 定期性能分析

// 1. 在开发过程中定期使用 Profiler
// 2. 在发布前进行全面性能分析
// 3. 监控生产环境性能

2. 建立性能基准

// 1. 记录性能基准
// 2. 对比优化前后性能
// 3. 设置性能目标

3. 使用自动化测试

// 1. 使用性能测试
// 2. 在 CI/CD 中集成性能测试
// 3. 自动检测性能回归

4. 持续优化

// 1. 持续监控性能
// 2. 及时修复性能问题
// 3. 优化关键路径

总结

性能分析是 Android 开发的重要环节。熟练掌握各种性能分析工具可以:

  1. 快速定位性能问题
  2. 优化应用性能
  3. 提升用户体验
  4. 降低资源消耗

建议:

  • 熟悉各种 Profiler 工具
  • 定期进行性能分析
  • 建立性能基准
  • 持续优化应用性能

最后更新2024年