安卓系统用久了卡顿如何处理(安卓系统为什么会卡)
卡顿原因千千万,定位也是真的难。安卓系统APP造成卡顿的问题不好定位,有时判断不好,甚至破坏了原本的运行程序,这是很大的问题。这篇文章介绍一款性能检测工具——友盟 U-APM平台,以及谈一谈导致卡顿的原因有哪些!
卡顿检测工具——友盟U-APM性能检测平台
U-APM是友盟根据性能问题研发出的一款性能检测工具,通过友盟的接入,我们就可以使用实时、精准、全面的应用崩溃、ANR、自定义异常等捕获能力, 以及卡顿检测、启动分析、内存分析、网络分析等性能监测能力,U-APM卡顿分析支持卡顿趋势的查看、卡顿列表的筛选、卡顿模块的计算、卡顿分布的筛选、卡顿详情页面的展示,通过U-APM提供的监控SDK 捕获所监控App主线程消息执行超时的情况,帮助开发者查找App卡顿问题。说完卡顿问题的定位检测,我们来探讨引起安卓App卡顿的原因有哪些?
第一、SurfaceFlinger 主线程耗时
SurfaceFlinger 负责 Surface 的合成 , 一旦 SurfaceFlinger 主线程调用超时 , 就会产生掉帧 .
SurfaceFlinger 主线程耗时会也会导致 hwc service 和 crtc 不能及时完成, 也会阻塞应用的 binder 调用, 如 dequeueBuffer \ queueBuffer 等.
第二、屏下光感截图导致 SurfaceFlinger 渲染不及时
有的 Android 机型使用了屏下光感 , 屏下光感的实现方法也会影响 SurfaceFlinger 主线程的运行 . 屏下指纹需要频繁截图 , 来区分光线和屏幕的变化 , 进行对应的亮度变化, 但是其主线程截图的方法会导致 SurfaceFlinger 主线程被截图操作所耽误, 从而导致卡顿
第三、HWC Service 执行耗时
hwc Service 耗时也会导致 SurfaceFlinger 下一帧不会做合成操作, 导致应用的 dequeueBuffer 和 setTransationState 方法被阻塞, 导致卡顿
第四、CRTC 执行耗时
crtc 执行耗时的结果就是 SurfaceFlinger 下一帧不会做合成操作, 导致应用的 dequeueBuffer 和 setTransationState 方法被阻塞, 导致卡顿
第五、CPU 调度问题
重要任务跑小核性能不足导致卡顿,RenderThread 跑小核,cpu 频率对性能的影响:
优先级低未能及时获取 cpu 时间片导致卡顿
在调度器看来的低优先级任务 , 在用户这里未必是低优先级任务 , 他可能正在和 App 的主线程交互 , 或者正在和 system_server 进行交互
被 RT 进程抢占
App 主线程或者渲染线程被 RT 进程抢占也会导致系统卡顿或者响应慢 , Google 也意识到了这个问题 , 也在尝试在应用启动的时候 , 把 App 主线程和渲染线程的优先级也设置为 RT , 不过这个属性一直没开 , 因为会导致应用启动速度变慢.
大小核调度导致
大小核调度的问题通常表现在该跑在大核的任务跑到了小核 , 或者该在小核运行的任务却持续跑到大核 ,或者错误的被绑定在了某一个核心上。
第六、触发 Thermal 导致限频
触发 Thermal 发热限频也有可能导致卡顿 , 这算是一种硬件级别的保护 , 如果手机已经过热 , 此时如果不进行干涉 , 那么可能会导致用户手机太烫而无法持续使用手机. 一般这个时候都会对系统的资源进行一些限制 , 比如降低 cpu\gpu 的最高频率之类的 , 这么做的话 , 势必也会对流畅性造成影响.
第七、后台活动进程太多导致系统繁忙
后台进程活动太多,会导致系统非常繁忙, cpu \ io \ memory 等资源都会被占用, 这时候很容易出现卡顿问题 , 这也是系统这边经常会碰到的问题
1、CPU 繁忙
dumpsys cpuinfo 可以查看一段时间内 cpu 的使用情况
主线程调度不到 , 处于 Runnable 状态,当线程为 Runnable 状态的时候 , 调度器如果迟迟不能对齐进行调度 , 那么就会产生长时间的 Runnable 线程状态 , 导致错过 Vsync 而产生流畅性问题.
2、Runnable
无关进程活跃耗时
无关进程通常是人为定义的 , 指的是与当前前台 App 运行无关的进程 , 这些活跃进程势必会对 App 主线程的调度产生影响 , 不管这些无关进程是系统的还是 App 自身的 , 或者是其他三方 App 的。
3、cpu 被占用
原因同上 , 当后台任务过多的时候 , cpu 资源就会异常紧缺 ,在系统低内存的时候 , HeapTask 和 kswapD 几乎占满了整个 cpu , 在疯狂地向系统申请内存。
4、SystemServer 锁
system_server 的 AMS 锁和 WMS 锁, 在系统异常的情况下, 会变得非常严重, 许多系统的关键任务都被阻塞, 等待锁的释放, 这时候如果有 App 发来的 Binder 请求带锁, 那么也会进入等待状态, 这时候 App 就会产生性能问题; 如果此时做 Window 动画 , 那么 system_server 的这些锁也会导致窗口动画卡顿。
以上文章是关于安卓系统APP卡顿原因的详细分析,关于APP卡顿的解决方案我们下次再谈,本文还介绍了一款应用性能检测工具——友盟 U-APM,另外,U-APM还具有其他的功能值得我们进行研究,感兴趣的小伙伴可以登录官网体验。