安卓软件优化差为什么(安卓优化软件哪个好)

对于用户而言,类如内存占用高、耗流量、耗电量等性能问题可能不会轻易被发现,但是卡顿问题肯定会直观的感受到。接下来,就带大家了解下卡顿发生原因、如何检测及如何避免卡顿。

1、卡顿产生的原理

60帧每秒是目前最合适的图像显示速度,也是绝大部分Android设备设置的调试频率,如果在16ms内顺利完成界面刷新操作可以展示出流畅的画面,而由于任何原因导致接收到VSYNC信号的时候无法完成本次刷新操作,就会产生掉帧的现象,刷新帧率自然也就跟着下降(假定刷新帧率由正常的60fps降到30fps,用户就会明显感知到卡顿)


2、卡顿产生的原因

(1) UI线程中的耗时操作

UI线程中有I/O读写、数据库访问等耗时操作;

(2) 复杂、不合理的布局以及OverDraw

不合理的布局虽然可以完成功能,但随着控件数量越多、布局嵌套层次越深,展开布局花费的时间几乎是线性增长,性能也就越差;

避免OverDraw导致的性能损耗;

(3) 内存使用异常导致的卡顿

内存抖动、内存泄漏都会导致:GC的次数越多、消耗在GC上的时间越长,CPU花在界面绘制上的时间相应越短;

(4) 错误的异步方式

对线程开启方式的不同选择以及不同配置都可能导致卡顿的发生;

3、卡顿检测办法

(1) StickMode

StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。可以设置不同的线程检测策略、虚拟机检测策略。


当违规操作发生时,可以根据自定义的策略记录下Log或者Crash,以便于跟踪改善。

(2) TraceView

与StickMode相比,TraceView简直是发现Block根源的神器,不仅能看出每个方法消耗的时间、发生次数,并且可以进行排序,直接从最耗时的方法开始处优化;

(3) AndroidPerformanceMonitor

AndroidPerformanceMonitor 是一个检测卡顿的开源库,前身是BlockCanary,更前身则是LeakCanary。而其使用与LeakCanary也比较相似,可以自主设置卡顿检测时间,检测到的卡顿同样是以Notification展示,在使用体验上也相当类似,与LeakCanary可以说是孪生兄弟。

原理

利用了Looper.loop()中每个Message被分发前后的Log打印,而我们设置自己的Printer就可以根据Log的不同的处理:

·Message分发前,延时执行一个Runnable,这个时间可自己设置;

·Message在规定的时间内完成分发,则会取消掉这个Runnable;

·Message没有在规定的时间内完成分发,那这个Runnable就会被执行,可以获取到当前的堆栈信息;


(4) ANR-WatchDog

ANR-WatchDog同样是一个检测卡顿的检测库,与AndroidPerformanceMonitor不一样的是它的原理相对简单:

·原理是开启一个线程,持续循环不断的往UI线程中Post一个Runnable(修改一个数的大小),然后在规定时间之后检测这个Runnable是否被执行(数的大小有没有 被修改过来)。没有被执行的话说明主线程执行上一个Message超时,然后获取当前堆栈信息;

·ANR-WatchDog的原理更加简单,但是根据使用情况来看准确性不及AndroidPerformanceMonitor高,而且可设置的配置不如AndroidPerformanceMonitor丰富;

(6) Choreographer

我们知道Android系统每隔16ms都会发出VSYNC信号,触发UI的绘制,而我们可以拿到回调的监听。如果16ms没有回调的话我们就知道发生了卡顿。


备注:这种方式的原理也比较简单,但是可用性不高,只能测出界面绘制的卡顿

友盟U-APM卡顿分析

如果主线程2秒没有响应,则记为一次卡顿,提供卡顿列表,卡顿趋势、卡顿分布、卡顿详细日志、卡顿设备信息等数据,直接定位到问题代码位置,简单明了(推荐)。


4、避免卡顿的方法

在第三节我们分析了产生卡顿的原因,那么避免卡顿的方法就很简单了:反其向行知即可。

(1) 将耗时操作移到异步中

类如I/O读写、数据库访问等都应该采用异步的方式,不能有“只是一个很小的文件”之类的想法,防微杜渐;

(2) 合理优化布局,避免OverDraw。

同样的实现功能界面,不同的布局方式产生的View个数以及渲染耗时差异是数倍的;

(3) 合理优化内存

节省内存的分配空间,尽可能的降低GC的频率,缩短GC的平均时间;CPU不被占用,卡顿的几率就会更低;

(4) 正确使用异步

再次强调一遍:耗时操作不能都直接随意交给异步,不正确的异步使用方式反而会加剧卡顿;

综上所述,就是对Android App卡顿优化的简单描述了,关于文中说到的卡顿的检测办法提到一款第三方检测工具—友盟U-APM,是我本人以及身边的开发朋友都用过的,它可以对App全方位检测,功能全面,简单易用,能直接定位性能问题,使用体验不错,所以推荐给大家。

除卡顿分析功能外,通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力,及卡顿、启动分析等性能能力,支持多场景、多通道智能告警监控,帮助开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。另外,具有云真机服务的功能,也可供大家使用~