Android 卡顿优化

基础知识

造成卡顿的原因可能有千百种,不过最终都会反应到 CPU 时间上。
CPU 时间可分为两种:

  • 用户时间
    执行用户态应用程序代码所消耗的时间。
  • 系统时间
    执行内核态系统调用所消耗的时间,包括 I/O、锁、中断以及其他系统调用时间。

CPU 性能
评价一个 CPU 的性能,需要看主频、核心数、缓存等参数,具体表现出来的是计算能力和指令执行能力,也就是每秒执行的浮点计算数和每秒执行的指令数。当然还要考虑到架构问题。

通过下面的方法h获得设备的 CPU 信息:

1
2
3
4
5
// 获取 CPU 核心数
cat /sys/devices/system/cpu/possible

// 获取某个 CPU 的频率
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

GPU:图形处理器。又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备上图像运算工作的微处理器。
NPU:嵌入式神经网络处理器(NPU)采用”数据驱动并行计算”的架构,特别擅长处理视频、图像类的海量多媒体数据。

卡顿问题分析指标
先查看 CPU 的使用率:

  • 通过 /proc/stat 得到整个系统的 CPU 使用情况
  • 通过 /proc/[pid]/stat 可得到某个进程的 CPU 使用情况

除了 CPU 的使用率,还需要查看 CPU 饱和度。
CPU 饱和度反应的是线程排队等待 CPU 的情况,也就是 CPU 的负载情况。几个影响 CPU 饱和度的条件如下:

  • 应用的线程数
  • 线程优先级

卡顿排查工具

从实现上这些工具分为两个流派:

  • instrument
    获取一段时间内所有函数的调用过程,可以通过分析这段时间内的函数调用过程,再进一步分析待优化的点。
  • sample
    有选择性或采用抽样的方式观察某些函数的调用过程,可通过这些有限的信息推测出流程中的可疑点,再进一步细化分析。

常用的卡顿排查工具:

  • Traceview:想分析整个程序执行流程的耗时,可以选择。或是插桩版本的 systrace。
  • Nanoscope
  • systrace:想分析系统调用
  • Simpleperf:需要分析 Native 代码的耗时

可视化方法

在 Android Studio 3.2 的 Profiler 中直接集成了几种性能分析工具:

  • Sample Java Methods 的功能类似于 Traceview 的 sample 类型。
  • Trace Java Methods 的功能类似于 Traceview 的 instrument 类型。
  • Trace System Calls 的功能类似于 systrace。
  • SampleNative(API Level 26+)的功能类似于 Simpleperf。

对分析结果的两种展示方式:

  • Call Chart
  • Flame Chart

卡顿监控

1、消息队列
2、插桩
3、Profilo


其他监控

除了主线程的耗时过长之外,Android Vitals 是 Google Play 官方的性能监控服务(它自己有权限可以准确监控和上报 ANR),涉及卡顿相关的监控有 ANR、启动、帧率三个。

帧率
业界都使用 Choreographer 来监控应用的帧率。并且应该只在界面存在绘制的时候才做统计。
通过 addOnDrawListener 监听界面是否存在绘制行为:

1
getWindow().getDecorView().getViewTreeObserver().addOnDrawListener

生命周期监控

线程监控


链接

参考资料:
极客时间-Android开发高手课