• 卡顿优化


    卡顿优化

    卡顿优化与优化工具

    • 卡顿

      卡顿容易被直观感受,而且问题难以定位

      卡顿产生的原因复杂:代码、内存、绘制、IO、难以复现

    • 工具

      • CPU Profiler

        图形形式展示执行时间、调用栈等等;信息全面、包含所有线程;但是运行时开销严重,整体都会变慢Debug.startMethodTracing("文件名");Debug.startMethodTracing();

      • Systrace

      • StrictMode

        严苛模式,Android提供的运行时检测机制,可以帮助开发人员自动检测代码违例的情况,并且按照我们的配置给出响应的反应。方便强大,容易被忽视,主要检测两大问题线程策略虚拟机策略检测。

        线程策略:(1)自定义的耗时调用,detectCustomSlowCalls();(2)磁盘读取操作,detectDiskReads、detectDiskWrites();(3)网络操作,detectNetwork()。

        虚拟机策略:(1)Activity泄露,使用detectActivityLeaks()开启;(2)未关闭的Closable对象泄露,使用detectLeakedClosableObjects()开启;(3)泄露的Sqlite对象 使用detectLeakedSqlLiteObjects()开启;(4)检测实例数量 使用setClassInstanceLimit()开启。
        开发环境下启动严苛模式,发布应用一定要禁用。

        参考

    自动化卡顿检测方案以及优化

    • 自动卡顿检测方案原理

      系统工具适合线下针对性分析问题,但是不能线上使用;而卡顿现象与实际场景非常紧密,所以需要线上以及测试环节自动化检测方案,同时记录卡顿发生时的场景。

      原理:消息处理机制。一个线程无论有多少Handler,都只有一个Looper存在,主线程当中执行任何方法都会通过Looper的loop方法执行;而loop方法中有一个mLogging对象,在每个Message处理前后被调用;主线程如果发生了卡顿,那就是在dispatchMessage中执行了耗时操作,也就可以用mLogging对这个方法中的操作的执行时间进行监控。

      具体实现:Looper.getMainLooper().setMessageLogging()设置自己的logging,这样每个massage被处理的之前和之后都会调用自己设置的logging;匹配到>>>>>Dispatching,之后执行任务获取堆栈信息以及当前的一些场景信息,比如内存大小、电量、网络状态等等;匹配到<<<<<Finished,说明在执行的阈值之内,Message被处理完成,没有发生卡顿,就将这个任务取消掉。

    • AndroidPerformanceMonitor实践

      AndroidPerformanceMonitor是一个非侵入式的性能监控开源组件,通知形式弹出卡顿信息,定位精确到可以是具体某一行。但是也存在一些问题,确实卡顿了,但是卡顿堆栈可能并不准确,和OOM一样,最后的堆栈只是表象,不是真正的问题。那么,就可以获取监控周期内的多个堆栈,而不仅仅是最后一个。

      startMonitor -> 高频采集堆栈 -> endMonitor

      记录多个堆栈 -> 上报服务器

      就能知道卡顿期间是那些方法在执行,那些方法比较耗时。

    • 问题及优化

      涉及到海量卡顿堆栈处理,高频卡顿上报量太大,服务端会有压力。

    ANR分析与实践

    • ANR

      ANR执行流程:发生ANR;进程接收异常终止信号,开始写入进程ANR信息;弹出ANR提示框。

      ANR解决思路:

      (线下)adb pull data/anr/traces.txt 存储路径(导出);详细分析是CPU、IO、锁等情况导致的ANR。

      (线上)通过FileObserver监控文件变化,会有高版本权限问题。

    • ANR-WatchDog原理与实践

      ANR-WatchDog是一个非侵入式ANR监控组件(开源),弥补了高版本无权限读traces.txt文件的问题。

      原理:start -> post消息改值 -> sleep -> 检测是否修改 -> 判断ANR发生

    卡顿单点问题检测

    • 关于卡顿单点问题

      自动卡顿检测方案并不能满足所有场景的要求,而且体系化解决方案务必尽早暴露问题,需要关注的一些单点问题有:主线程IPC、DB等等。

    • IPC问题监测

      • 检测指标:IPC调用类型、每一个调用的次数以及耗时、调用堆栈与发生线程。

      • 常规方案:IPC前后埋点。只是不够优雅,维护成本大。

      • 检测技巧:adb命令 “adb shell am trace-ipc start” 来监测; “adb shell am trace-ipc stop ”检测结束,并导出文件到data/local/tmp/ipc-trace.txt中。

      • 优雅方案:

        ARTHook:可以Hook系统方法

        AspectJ:非系统方法

      • 监控纬度:IPC、IO、DB、View绘制

    • 单点问题检测方案

    实现界面秒开

    • 界面秒开实现

      界面秒开就是一个小的启动优化,涉及到启动优化与布局优化。

      SysTrace,优雅异步+优雅延迟初始化

      异步Inflate、X2C、绘制优化

      提前获取页面数据。

    • 界面秒开率统计

      onCreate到onWindowFocusChanged

      特定接口

    • Lancet

      轻量级 Android AOP框架(开源)。编译速度快,支持增量编译,API简单,没有任何多余代码插入。

    监控耗时盲区

    卡顿优化技巧

    • 耗时操作:异步、延迟
    • 布局优化:异步Inflate、X2C、重绘解决
    • 内存:降低内存占用,减少GC时间

    系统工具:SysTrace、TraceView

    自动化监控及优化:AndroidPerformanceMonitor、ANR-WatchDog。高频采集,找出重复率高的堆栈。

    卡顿监控工具:单点问题AOP、Hook;盲区监控gradle编译替换

    卡顿监控指标:卡顿率、ANR率、界面秒开率、交互时间、声明周期时间、上报环境、场景信息。

    卡顿优化相关问题

    卡顿优化的阶段变化:

    第一阶段:系统工具定位、解决

    第二阶段:自动化卡顿方案及优化

    第三阶段:线上监控以及线下检测工具建设

  • 相关阅读:
    VB.Net常用数学函数整理
    VB6转换C#2010步骤及工具
    通用MD5加密演示
    一行代码解决VB.NET中Dialog窗体销毁不刷新主窗体
    JavaScript中defer 和onload的执行顺序
    XML读取事例程序
    C#正则表达式使用指引
    使用Response.ContentType 来控制下载文件的类型
    重载、重写的简易解释
    西历转和历函数
  • 原文地址:https://www.cnblogs.com/chen-ying/p/12549718.html
Copyright © 2020-2023  润新知