3.2.3 Android & Java性能优化工具锦集

1 minute read

磁盘

工具集

工具 问题 能力
Systrace / Strace 主线程I/O、I/O操作耗时过长 发现
StrictMode 主线程I/O 发现 + 定位

内存

工具集

工具 问题 能力 场景
top/procrank 内存占用过大,内存泄露 发现 初步发现内存泄露
StrictMode Activity泄露 发现 初步发现内存泄露
meminfo Native内存泄露、是否存在Activity、ApllicationContext泄露、数据库缓存命中率低 发现+初步定位 初步发现Native内存泄露
MAT、Finder、JHAT Java层的重复内存、不合理图片解码、内存泄露等 发现+定位 定位内存泄露和OOM
libc_malloc_debug_leak.so Native内存泄露(JNI层) 发现+定位  
LeakCanary Activity内存泄露 自动发现+定位 初步发现内存泄露, 获取堆栈
APT 内存占用过大,内存泄露 发现  
GC Log from Logcat、 GC Log生产图标 人工触发GC for Explicit而导致的卡顿,Heap内存不足触发GC for Alloc 而导致的卡顿 发现+初步定位  
Systrace GC导致的卡顿 发现  
Allocation Tracker 申请内存次数过多和过大、辅助定位GC Log发现的问题 发现 + 定位 定位[引发大量GC引起的卡顿或者内存问题
chrome devtool HS的内存问题 发现+定位  

网络

工具集

工具 问题 能力 场景
Wireshark 最专业的网络分析工具,全部网络性能问题的分析定位都可以查看它 发现+定位 网络问题全能冠军
Fiddler/charles 主要针对HTTP,帮助发现HTTP众多性能问题,还能模拟错误和延时的HTTP返回 发现+定位 模拟和定位HTTP问题
mitmproxy 中间人代理工具, 可用于抓包 发现+定位 定位HTTP问题
Tcpdump 抓包工具,要Root权限 发现+定位  
traceroute 定位网络路由问题,包括就近接入、跨运营商问题 发现+定位  
ARO 无压缩、重复下载、缓存失效等等 自动发现+定位  
tPackageCapture 无Root抓包 定位  

CPU

工具集

工具 问题 能力
Top   发现
ps   发现
dumpsys cpuinfo   发现
Systrace   定位
TraceView   定位
Trepn 耗电的分析工具, 显示电池耗电量, 获取骁龙芯片GPU的频率和负载 发现

性能分析

工具集

工具 问题 能力 场景
TinyDancer FPS 发现 初步发现帧率问题
Systrace 分析绘制时流程导致的卡顿,能大概定位是GC、I/O、贴图太大,还是没用ViewHolder的问题 发现+初步定位  
TraceView 能深入定位分析各种流畅度与时延问题,但是只能初步定位XML布局和OpenGL绘制的性能问题 发现+定位  
Gfxinfo/Slickr 定位硬件加速下的性能问题 发现+初步定位  
Hierarchy Viewer 定位XML布局导致的性能问题 自动发现+定位  
Tracer for OpenGl/Adreno/UXTune 具体定位绘制性能问题 发现+定位  
Chrome Devtool 定位具体的H5卡顿问题 发现+定位  

问题场景与定位经验

  • Crash
    • 出现捕获不了日志或者崩溃堆栈比较奇怪的crash
      • 定位
        • 在该场景下, 使用内存压测, 看看内存(显存, Java内存和Native内存)上涨(暴涨)情况, 如出现泄露或者暴涨, 获取可分析的数据(内存dump文件)
      • 分析, 解决
        • Java内存可通过获取hprof
        • Native内存可通过DDMS的Native Heap
  • OOM
    • 定位
      • 挖掘特征, 包括但不限于代码改动、机器特征、时间特征等,必要时还需要做一定的统计分析
      • 根据特征寻找复现路径, 使用内存压测
      • 获取可分析的数据 (内存dump文件)
    • 分析, 解决
      • 使用MAT分析和定位
  • ANR/死锁
    • 定位
      • 获取logcat日志以及trace.txt
    • 分析, 解决

使用教程

参考资料