卡顿优化

卡顿优化

卡顿优化与优化工具

  • 卡顿

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

    卡顿产生的原因复杂:代码、内存、绘制、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率、界面秒开率、交互时间、声明周期时间、上报环境、场景信息。

卡顿优化相关问题

卡顿优化的阶段变化:

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

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

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

猜你喜欢

转载自www.cnblogs.com/chen-ying/p/12549718.html