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文件)
 
- 分析, 解决
        
      
 
- ANR/死锁
    
  
使用教程
参考资料