美文网首页
Android 卡顿分析

Android 卡顿分析

作者: maybe0813 | 来源:发表于2021-05-13 19:59 被阅读0次

卡顿

大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔大概16.6ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。

卡顿的原因

如果某个操作花费时间超过16ms,系统在得到VSYNC信号的时候就无法进行正常渲染,这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面。

有很多原因可以导致丢帧,一般主线程过多的UI绘制、显示的Bitmap过大、大量的IO操作、内存抖动、WebView内容复杂、Webview与主线程交互(jsbridge方案)或是大量的计算操作占用CPU,都会导致App界面卡顿。

推荐大神文章 https://www.androidperformance.com/2019/09/05/Android-Jank-Due-To-App/

卡顿分析工具

  • 用Systrace查看大致区间帧情况

    Systrace 是Android平台提供的一款工具( python 脚本文件,位于 Android SDK目录/platform-tools/systrace 中,其内部将调用 atrace 程序),用于记录短期内的设备活动。该工具会生成一份报告,其中汇总了Android 内核中的数据,例如 CPU 调度程序、磁盘活动和应用线程。Systrace主要用来分析绘制性能方面的问题。在发生卡顿时,通过这份报告可以知道当前整个系统所处的状态,从而帮助开发者更直观的分析系统瓶颈,改进性能。

    1.(非必须)在java代码中使用androidx.core.os.TraceCompat API ,为信息添加标签

    //标签为animator
    TraceCompat.beginSection("animator");
    //......
    TraceCompat.endSection();
    

    2.开始采样

    python systrace.py -t 5 -o [保存在电脑中的目录\dest.html] gfx input view am dalvik sched wm disk res -a [应用包名]
    

    3.使用chrome打开保存在电脑中的目录\dest.html文件

systrace.png

主要查看Frames中出现连续红色、黄色的点的区间段进行分析

推荐大神文章 https://androidperformance.com/2019/07/23/Android-Systrace-Pre/

  • App层面监控卡顿

    目前有两种主流有效的app监控方式:

    • 利用UI线程的Looper打印的日志,实现Printer接口并设置(BlockCanary)

      Looper在分发出来Message时,会打印耗时日志,并提供了设置打印机的方法

looper设置printer.png looper的log.png
  • 使用Choreographer.FrameCallback获取帧率

    public static void start() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
                long lastFrameTimeNanos = 0;
    
                @Override
                public void doFrame(long frameTimeNanos) {
                    //上次回调时间
                    if (lastFrameTimeNanos == 0) {
                        lastFrameTimeNanos = frameTimeNanos;
                        Choreographer.getInstance().postFrameCallback(this);
                        return;
                    }
                    long diff = (frameTimeNanos - lastFrameTimeNanos) / 1_000_000;
                    if (diff > 16.6f) {
                        //掉帧数
                        int droppedCount = (int) (diff / 16.6);
                    }
                    lastFrameTimeNanos = frameTimeNanos;
                    Choreographer.getInstance().postFrameCallback(this);
                }
            });
        }
    }
    

Looper方式比较适合在发布前进行测试或者小范围灰度测试然后定位问题,Choreographer方式适合监控线上环境的 app 的掉帧情况来计算 app 在某些场景的流畅度然后有针对性的做性能优化。

相关文章

  • Android开发页面帧率优化有感

    Android APP 优化工具分析Android App优化之消除卡顿Android性能优化:卡顿优化Andro...

  • Android 内存泄漏总结

    Android 性能相关知识 Android性能之 内存泄漏总结 Android性能之 卡顿分析解决 Androi...

  • Android 卡顿分析

    卡顿原因 造成Android系统卡顿的原因有很多,但是追根究底都会反映在cpu时间上.通过分析内存信息和cpu信息...

  • Android 卡顿分析

    卡顿 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔大概16.6ms发出VS...

  • Android卡顿分析

    一、卡顿原因 屏幕1秒60帧,平均每帧16.6毫秒,如果代码实现不佳,或者过于复杂,导致一帧绘制时间大于16.6毫...

  • Android性能优化汇总

    页面卡顿、cpu、gpu占用分析 android性能跟踪分析工具系列 - GPU 呈现模式分析 为什么Andro...

  • 2017.03.12 Android卡顿分析

    欢迎访问[Android日记][1],如有转载请注明Android日记 http://androiddiary.s...

  • Android动画卡顿分析

    最近处理了一个动画卡顿的问题,记录一下分析的过程; 问题分析 看了一下,出现卡顿的是一个位移的动画,具体的实现是通...

  • Android-卡顿分析

    APP的优化是任重而道远的过程,必须在意每一个环节,否者当你想要优化的时候,发现到处都是坑,已经不知道填补哪里了,...

  • 卡顿优化②原因分析和监控工具

    卡顿分析 造成卡顿的原因可能是多种多样的,但是最终都会反映在CPU时间上。Android系统是基于Linux的,可...

网友评论

      本文标题:Android 卡顿分析

      本文链接:https://www.haomeiwen.com/subject/kbwzdltx.html