Android性能优化四:卡顿监测方案及原理

本文详细介绍了Android卡顿的监测与优化方案,包括Profiler、Systrace和StrictMode等工具的使用,自动化卡顿检测原理,以及ANR的分析与实战。还探讨了卡顿单点问题检测,如IPC问题的监测指标和优雅解决方案,并提到了耗时盲区的监控方法。
摘要由CSDN通过智能技术生成

1.卡顿介绍及优化工具的选择

1.1背景介绍

很多性能问题不易被发现,但是卡顿却很容易被直观感受,另外一方面,对开发者来说,卡顿的问题的排查和定位有一定的难度。因为卡死产生的原因是错综复杂的,比如代码问题,内存环境、绘制过程,IO操作等等情形都有可能导致卡顿,尤其是线上的卡顿问题,受限于用户具体的运行环境,在线下难以复现,所以最好是能记录卡顿产生时的环境。

1.2工具介绍

Profiler介绍

  • 图形的形式展示执行的时间、调用栈等信息

  • 信息全面、包含所有线程

  • 运行时开销严重,应用整体变慢(可能带偏优化方向)

使用方式

  • Debug.startMethodTracing();
  • Debug.stopMethodTracing();
  • 生成文件在sd卡:Android/data/packagename/files

Systrace介绍

结合Android内核的数据,生成Html报告

API18以上使用,推荐TraceCompat向下兼容

使用方式

  • TraceCompat.beginSection(“xxx”);// 手动埋点起始点

  • TraceCompat.endSection();// 手动埋点结束点

  • python systrace.py -b 32768 -t 5 -a packageName -o trace.html sched gfx view wm am app

优势:

  • 轻量级,开销小

  • 直观反映cpu利用率

  • 根据问题给出建议(比如绘制慢或GC频繁)

Systrace具体使用不是本文重点,有兴趣的可参考: Android应用开发性能优化完全分析

StrictMode介绍

严苛模式,Android提供的一种运行时检测机制,可以用来帮助检测代码中一些不规范的问题,项目中有成千上万行代码,如果通过肉眼对代码进行review,这样不但效率低下,而且还容易遗漏问题。使用StrictMode之后,系统会自动检测出来主线程当中一些违例的情况,同时按照配置给出相应的反应。它主要用来检测两大问题,一个是线程策略,另一个是虚拟机策略,StrictMode方便强大,但是容易因为不被熟悉而忽视。

线程策略的检测内容主要包括一下几个方面

  • 自定义的耗时调用,detectCustomSlowCalls()

  • 磁盘读取写入操作,detectDiskReads

  • 网络操作,detectNetwork

虚拟机策略检测内容主要包括以下几个方面

  • Activity泄露,detectActivityLeaks()
  • 未关闭的Closable对象泄漏,detectLeakedClosableObjects()
  • Sqlite对象泄露,detectLeadedSqlLiteObjects
  • 检测某个具体实例数量,setClassInstanceLimit()

StrictMode一般用于线下检测,可以在应用的Application、Activity或者其他应用组件的onCreate方法中加入检测代码

if (BuildConfig.DEBUG) {
   
            //线程策略检测
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode
                    .detectDiskReads()
                    .detectDiskWrites()
                    .detectNetwork()// or .detectAll() for all detectable problems
                    .penaltyLog() //在Logcat 中打印违规异常信息
                    .build());

            //虚拟机策略检测
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectLeakedSqlLiteObjects()
                    .setClassInstanceLimit(UserBean.class, 1)
                    .detectLeakedClosableObjects() //API等级11
                    .penaltyLog()
                    .build());
        }

可以通过配置peanltyLog(),在Logcat 中打印违规异常信息,或者penaltyDialog(),通过Dialog的方式提示违规异常信息。

2.自动化卡顿检测方案原理

前面简单介绍了Profiler、Systrace系统工具,但是系统工具比较适合线下问题针对性分析,但是卡顿问题和实际使用的场景紧密结合,因此线上环境及测试环节需要自动化检测方案,来帮我们定位卡顿,更重要的是记录卡顿发生时的场景。

2.1自动化卡顿监测原理

它的原理基于Android的消息处理机制,一个线程无论有多少个Handler,都只有一个Looper,主线程中执行的任何代码,都会通过Looper.loop()分发执行,而Looper中有一个mLogging对象,它在每个message处理前后都会被调用,如果主线程发生了卡顿,一定是在dispatchMessage中执行了耗时操作,因此可以通过mLogging对dispatchMessage执行的时间进行监控。

public static void loop() {
   
        
		...
        for (;;) {
   
            Message msg = queue.next(); // might block
            if (msg == null) {
   
                // No message indicates that the message queue is quitting.
                return;
            }

            // This must be in a local variable, in case a UI event sets the logger
            final Printer logging = me.mLogging;
            if (logging != null) {
   
                logging.
Android系统性能优化对于解决卡顿、提升稳定性和优化续航方面起着重要的作用。 首先,在解决卡顿问题上,开发人员需要关注应用程序的UI线程。为了确保应用程序的流畅运行,可以采用以下优化措施:优化布局文件,减少层级嵌套;使用异步加载图片,避免在主线程中进行网络请求等耗时操作;合理利用缓存机制,避免重复加载数据。此外,还可以针对卡顿问题进行性能分析,通过工具查找耗时操作,并进行相应的优化。 其次,在提高系统稳定性方面,开发人员需要考虑异常崩溃的处理和内存管理。异常崩溃处理可通过捕获并记录崩溃异常来及时解决问题和改进代码。内存管理方面,应避免内存泄漏和过度分配内存,使用系统提供的工具来进行内存管理和优化。 最后,在续航优化上,需要考虑电源管理和资源使用的合理分配。通过使用省电模式、灵活控制后台任务和限制应用程序在后台运行等方式,最大程度地延长设备的电池寿命。另外,合理管理资源,避免过度使用CPU、网络和图形渲染等资源,有助于降低能耗并优化系统续航。 总之,Android系统性能优化是一个综合性的工作,需要开发人员关注卡顿问题、提升稳定性和优化续航方面的问题。通过合理使用工具和采取相应的优化措施,可以实现系统性能的有效提升。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值