Android 卡顿优化

基础知识
造成卡顿的原因可能有千百种,不过最终都会反应到 CPU 时间上。
CPU 时间可分为两种:
- 用户时间
执行用户态应用程序代码所消耗的时间。 - 系统时间
执行内核态系统调用所消耗的时间,包括 I/O、锁、中断以及其他系统调用时间。
CPU 性能
评价一个 CPU 的性能,需要看主频、核心数、缓存等参数,具体表现出来的是计算能力和指令执行能力,也就是每秒执行的浮点计算数和每秒执行的指令数。当然还要考虑到架构问题。
通过下面的方法h获得设备的 CPU 信息:
1 | // 获取 CPU 核心数 |
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开发高手课