一、卡顿(Jank)的定义
Android团队把滞缓,不流畅的动画定义为卡顿(jank),一般是由于丢帧引起的。从Android诞生的第一天直到现在的8核CPU,Android始终未能摆脱卡顿的问题。在Android APP的性能测试中卡顿测试是非常重要的一部分。
二、Android的"16ms"原则
Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。为什么是16ms,因为Android设定的刷新率是60FPS(Frame Per Second),也就是每秒60帧的刷新率, 约16ms刷新一次。这就意味着,,我们需要在16ms内完成下一次要刷新的界面的相关运算,,以便界面刷新更新。举个例子,当运算需要24ms完成时,16ms时就无法正常刷新了,而需要等到32ms时刷新,这就是丢帧了。丢帧越多,给用户的感觉就越卡顿。
三、卡顿的原因分析
我们知道,对于APP的每一个View,Android系统都会通过三个步骤来渲染:Measure(测量)、Layout(布局)和Draw(绘制)。measure从最顶部的节点开始,顺着layout树形结构依次往下测量每个view需要在屏幕中展示的尺寸大小。每个子节点都需要向父节点提供自己的尺寸来决定展示的位置,遇到冲突时,父节点可以强制子节点重新measure(可能导致时间消耗为原来的2-3倍)。因此扁平化的view结构会性能更好。
RelativeLayouts经常需要measure所有子节点两次才能把子节点合理的布局。如果子节点设置了weights属性,LinearLayouts也需要measure这些节点两次,才能获得精确的展示尺寸。如果LinearLayouts或者RelativeLayouts被套嵌使用,measure所费时间可能会呈指数级增长。
一旦view开始被measure,该view所有的子view都会被重新layout,再把该view传递给它的父view,如此重复一直到最顶部的根view。layout完成之后,所有的view都被渲染到屏幕上。需要特别注意到是,并不是只有用户看得见的view才会被渲染,所有的view都会。APP拥有的views越多,measure,layout,draw所花费的时间就越久。要缩短这个时间,关键是保持view的树形结构尽量扁平,而且要移除所有不需要渲染的view。移除这些view会对加速屏幕渲染产生明显的效果。理想情况下,总共的measure,layout,draw时间应该被很好的控制在16ms以内,以保证滑动屏幕时UI的流畅。
对于布局的检查,我们可以通过Hierarchy Viewer来检查。Hierarchy Viewer不仅可以很方便可视化的查看屏幕上套嵌的view结构,还可以点击任何一个view来展示子view的数量,和measure, layout, draw的耗时。Hierarchy Viewer还可以帮助发现overdraw(重复的绘制)。
Overdraw用来描述一个像素在屏幕上多少次被重绘在一帧上。通俗的说:理想情况下,每屏每帧上,每个像素点应该只被绘制一次,如果有多次绘制,就是overdraw。多次的重新绘制屏幕会使得绘制延迟变大,最终导致卡顿。overdraw还带来另一个问题,当view内容有更新的时候,之前绘制的view就失效了,view的每一个像素都需要重绘。Android设备没法判断哪个view是可见的,所以只能绘制每个view的相关像素。如果APP有很多层,每一层的相关像素都需要绘制一遍,一不小心,就会带来性能问题。
Android提供了一些很好的工具来检测overdraw。Jelly Bean 4.2里,开发者选项菜单里增加了Debug GPU Overdraw的选项。选择“Show Overdraw areas”选项之后,会在app的不同区域覆盖不同的颜色来表示overdraw的次数。比较屏幕上这些不同的颜色,可以快速方便的定位overdraw问题:
原色: 没有overdraw
蓝色: 1次overdraw
绿色: 2次overdraw
粉色: 3次overdraw
红色: 4次及4次以上的overdraw
在KitKat或者更新的设备里,overdraw被大幅度的削减了。这项技术叫overdraw avoidance,系统可以检测发现简单的overdraw场景(比如一个view完全盖住了另一个view),然后自动移除额外的绘制。这很明显会极大的提高设备的绘制性能。但开发者还是要尽可能的避免额外的overdraw(为了更好的性能,也为了能兼容Jelly Bean及更老的设备)。Jelly Bean 4.3 或者 KitKat 设备,在屏幕的左下角会有一个计数展示屏幕overdraw的程度。这个工具对检测overdraw十分有效。当使用这个检测工具时,KitKat的overdraw avoidance功能会被禁止。
参考链接:
http://mrpeak.cn/android/2016/01/11/android-performance-ui
相关推荐
【uni-app】是一款多端开发框架,它允许开发者编写一次代码,就能运行在iOS、Android、Web等不同平台上。然而,由于其非原生的特性,可能会遇到性能问题,这在React Native、Flutter等框架中也同样存在。本文将探讨...
综上所述,TXNews天行新闻androidapp项目涵盖了Android开发的多个核心方面,从UI设计到后台数据处理,再到性能优化和发布流程,为开发者提供了学习和实践Android应用开发的宝贵资源。对于想要深入了解Android开发的...
如果合成过程较慢,可能会造成UI卡顿。不过,对于小型文本和快速响应的需求,这种做法可能并无大碍。 4. **线程锁的使用**:线程锁用于控制并发访问资源,防止数据竞争和同步问题。在这个Demo中未使用线程锁,意味...
- **异步处理**:耗时操作如网络请求、数据处理应在后台线程进行,避免UI卡顿。 - **内存管理**:合理使用内存,防止内存泄漏。 10. **用户体验** - **响应式设计**:适配不同屏幕尺寸和分辨率的设备,提供良好...
总的来说,“android点餐app”项目涵盖了Android开发的多个核心领域,包括UI设计、数据存储、网络通信和用户体验优化。开发者在实现这些功能时,既要考虑技术的先进性,也要关注用户的实际需求,以打造出既实用又...
以下是一个关于如何在Android App中实现图片异步加载的详细实例。 一、概述 在Android中,图片异步加载通常涉及以下几个关键组件: 1. **LruCache**:内存缓存机制,用于存储已经加载过的图片,减少对磁盘和网络的...
4. **云播放技术**:"云播放"可能意味着APP支持从云端服务器直接播放电影,这涉及到服务器端的视频存储和分发,可能采用CDN(Content Delivery Network)来加速传输,减少延迟和卡顿。 5. **视频缓存与下载**:支持...
《Android应用开发:深入解析Brno Rentals App》 在当今移动互联网时代,各种应用程序已经渗透到我们生活的方方面面,其中租房类应用尤其受到关注。本文将深入探讨一款名为“Brno Rentals App”的Android应用,它是...
在Android开发中,传统的UI创建方式通常涉及到XML布局文件、Java代码以及自定义View的结合。然而,随着技术的发展,一种新的思路应运而生,那就是利用JavaScript与Android Activity进行交互来创建用户界面。这种方式...
考虑到用户体验,火车订票操作通常在后台线程中进行,避免阻塞主线程导致UI卡顿。Android提供了`AsyncTask`、`Handler`/`Looper`、`IntentService`等机制来实现异步任务。源码分析可能涉及如何在后台加载数据并更新...
在本项目中,我们关注的是一个基于Android平台的短视频应用程序,该应用仿照了流行的抖音APP。这个项目的核心目标是创建一个能够展示视频信息流的应用,用户可以通过它浏览各种短视频内容,并能无缝过渡到视频播放...
- 避免在`onUpdate()`方法中执行耗时操作,可能导致UI卡顿。 - 使用`BroadcastReceiver`监听事件,及时响应用户操作。 通过学习这份源码,开发者不仅能掌握AppWidget的基本使用,还能深入理解Android系统如何处理...
BlockCanary是一款针对Android平台的轻量级主线程卡顿检测框架,主要目的是帮助开发者发现并定位App在运行过程中可能出现的UI线程阻塞问题。它通过监听主线程的执行情况,当检测到主线程执行时间超过设定阈值时,会...
7. **异步处理**:Android应用应该避免在主线程执行耗时操作,以免导致UI卡顿。使用AsyncTask、Handler/Looper、RxJava或者Android的Coroutines可以进行异步处理,保证UI的流畅性。 8. **权限管理**:随着Android...
通过学习这套Android购物APP源代码,你可以掌握电商应用的全貌,包括前端UI设计、后端通信、数据存储、用户认证、支付流程等多个方面,对Android开发有更深入的理解,并能应用于自己的项目开发中。
总的来说,开发一个抢红包的安卓APP涵盖了移动应用开发的多个方面,包括UI设计、网络通信、数据库管理、多线程处理、用户通知、性能优化以及安全策略。每一个环节都需要开发者具备深厚的理论知识和实践经验,才能...
6. **异步处理**:为了防止UI卡顿,网络请求和数据库操作通常在后台线程(如AsyncTask、IntentService或使用Handler/Looper)进行。源码可能包含对异步编程的理解和实践。 7. **权限管理**:Android 6.0及以上版本...
基于Android天气预报APP设计与实现,主要功能集中在为用户提供实时和未来天气信息查询。用户可以通过此应用程序获取全国各地城市的天气状况,帮助他们做出出行决策。以下是该APP的主要功能模块: 1. 地理位置获取:...
【Android地图APP全项目】是一个基于Android Studio 2.2.3开发的项目,目标是构建一个能够实时显示和操作地图的应用程序。该应用利用了API级别26的功能,这通常意味着它支持Android 8.0(Oreo)及其以上版本的设备。...