导航:首页 > 操作系统 > androidapp卡顿原因

androidapp卡顿原因

发布时间:2025-03-14 19:54:30

A. androidUI卡顿原理分析及Vsync信号机制

一、UI卡顿定义 

1、用户角度:app操作界面刷新缓慢,响应不及时;界面滑动不够流畅; 

2、系统角度:屏幕刷新帧率不稳定,掉帧严重,无法保证每秒60帧,导致屏幕画面撕裂; 

二、UI卡顿常见原因分析以及处理方案 

1、过度绘制: 

原因:界面布局设计不合理或者过于复杂导致系统无法在16毫秒内完成渲染,view过度绘制导致CPU或者GPU负载过重,View频繁触发measure、layout操作,导致measure、layout累计耗时严重以及整个View错误的频繁重新渲染; 

方案:优化界面布局,使界面布局视图扁平化,去除不必要的背景颜色,减少透明色的使用; 

方案依据原理:尽量减少View在系统中measure、layout、draw的累计时间; 

2、UI线程的复杂运算 

原因:UI主线程运算耗时 

方案:减少UI线程中数据运算,使用子线程处理耗时任务 

3、频繁GC 

原因:(1)、内存抖动;(2)、瞬间产生大量对象,消耗内存; 

方案:尽量避免在循环逻辑或者onDraw方法中频繁创建新对象和使用局部变量; 

三、android Vsync机制 

1、什么是Vsync ? 

Vsync 是Vertical Synchronization(垂直同步)的缩写,是一种在PC上很早就广泛使用的技术,可以简单的把它认为是一种定时中断。而在Android 4.1(JB)中已经开始引入VSync机制,用来同步渲染,让AppUI和SurfaceFlinger可以按硬件产生的VSync节奏进行工作。 

2、Android屏幕刷新过程 

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),从上到下(屏幕刷新,垂直刷新,Vertical Scanning)。当整个屏幕刷新完毕,即一个垂直刷新周期完成,会有短暂的空白期,此时发出 VSync 信号。所以,VSync 中的 V 指的是垂直刷新中的垂直-Vertical。 

3、没有使用Vsync的情况 

可见vsync信号没有提醒CPU/GPU工作的情况下,在第一个16ms之内,一切正常。然而在第二个16ms之内,几乎是在时间段的最后CPU才计算出了数据,交给了Graphics Driver,导致GPU也是在第二段的末尾时间才进行了绘制,整个动作延后到了第三段内。从而影响了下一个画面的绘制。这时会出现Jank(闪烁,可以理解为卡顿或者停顿)。这时候CPU和GPU可能被其他操作占用了,这就是卡顿出现的原因; 

4、使用Vsync同步 

CPU/GPU接收vsync信号,Vsync每16ms一次,那么在每次发出Vsync命令时,CPU都会进行刷新的操作。也就是在每个16ms的第一时间,CPU就会响应Vsync的命令,来进行数据刷新的动作。CPU和GPU的刷新时间,和Display的FPS是一致的。因为只有到发出Vsync命令的时候,CPU和GPU才会进行刷新或显示的动作。CPU/GPU接收vsync信号提前准备下一帧要显示的内容,所以能够及时准备好每一帧的数据,保证画面的流畅; 

5、多级缓冲 

Android除了使用Vsync机制,还使用了多级缓冲的策略来优化屏幕显示,如双重缓冲(A + B),当Display buffer A 数据时,CPU/GPU就已经在buffer B 中处理下一帧要显示的数据了。 

可是,当系统资源紧张性能降低时,导致GPU在处理某帧数据时太耗时,在Vsync信号到来时,buffer B的数据还没准备好,此时不得不显示buffer A的数据,这样导致后面CPU/GPU没有新的buffer准备数据,空白时间无事可做,后面Jank频出

因此采用三级缓冲来解决系统对性能不稳定导致的卡顿

当出现上面所述情况后,新增一个buffer C 可以减少CPU和GPU在Vsync同步间的空白间隙,此时CPU/GPU能够利用buffer C 继续工作,后面buffer A 和 buffer B 依次处理下一帧数据。这样仅是产生了一个Jank,可以忽略不计,以后的流程就顺畅了。 

注:在多数正常情况下还是使用二级缓冲机制,三级缓冲只是在需要的时候才使用;

B. Android流畅度评估及卡顿优化

Google定义:界面呈现是指从应用生成帧并将其显示在屏幕上的动作。要确保用户能够流畅地与应用互动,应用呈现每帧的时间不应超过16ms,以达到每秒60帧的呈现速度(为什么是60fps?)。
如果应用存在界面呈现缓慢的问题,系统会不得不跳过一些帧,这会导致用户感觉应用不流畅,我们将这种情况称为卡顿。

来源于: Google Android的为什么是60fps?

16ms意味着1000/60hz,相当于60fps。这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。12fps大概类似手动快速翻动书籍的帧率, 这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的效果。 24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。 但是低于30fps是 无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,超过60fps就没有必要了。如果我们的应用没有在16ms内完成屏幕刷新的全部逻辑操作,就会发生卡顿。

首先要了解Android显示1帧图像,所经历的完整过程。

如图所示,屏幕显示1帧图像需要经历5个步骤:

常见的丢帧情况: 渲染期间可能出现的情况,渲染大于16ms和小于16ms的情况:

上图中应该绘制 4 帧数据 , 但是实际上只绘制了 3 帧 , 实际帧率少了一帧

判断APP是否出现卡顿,我们从通用应用和游戏两个纬度的代表公司标准来看,即Google的Android vitals性能指标和地球第一游戏大厂腾讯的PrefDog性能指标。

以Google Vitals的卡顿描述为准,即呈现速度缓慢和帧冻结两个维度判断:

PerfDog Jank计算方法:

帧率FPS高并不能反映流畅或不卡顿。比如:FPS为50帧,前200ms渲染一帧,后800ms渲染49帧,虽然帧率50,但依然觉得非常卡顿。同时帧率FPS低,并不代表卡顿,比如无卡顿时均匀FPS为15帧。所以平均帧率FPS与卡顿无任何直接关系)

当了解卡顿的标准以及渲染原理之后,可以得出结论,只有丢帧情况才能准确判断是否卡顿。

mpsys 是一种在设备上运行并转储需要关注的系统服务状态信息的 Android 工具。通过向 mpsys 传递 gfxinfo 命令,可以提供 logcat 格式的输出,其中包含与录制阶段发生的动画帧相关的性能信息。

借助 Android 6.0(API 级别 23),该命令可将在整个进程生命周期中收集的帧数据的聚合分析输出到 logcat。例如:

这些总体统计信息可以得到期间的FPS、Jank比例、各类渲染异常数量统计。

命令 adb shell mpsys gfxinfo <PACKAGE_NAME> framestats 可提供最近120个帧中,渲染各阶段带有纳秒时间戳的帧时间信息。

关键参数说明:

通过gfxinfo输出的帧信息,通过定时reset和打印帧信息,可以得到FPS(帧数/打印间隔时间)、丢帧比例((janky_frames / total_frames_rendered)*100 %)、是否有帧冻结(帧耗时>700ms)。
根据第2部分的通用应用卡顿标准,可以通过丢帧比例和帧冻结数量,准确判断当前场景是否卡顿。并且通过定时截图,还可以根据截图定位卡顿的具体场景。

如上图所示,利用gfxinfo开发的检查卡顿的小工具,图中参数和卡顿说明如下:

根据上面对gfxinfo的帧信息解析,可以准确计算出每一帧的耗时。从而可以开发出满足腾讯PerfDog中关于普通卡顿和严重卡顿的判断。

依赖定时截图,即可准确定位卡顿场景。如下图所示(此处以PerfDog截图示例):

通过第3部分的卡顿评估方法,我们可以定位到卡顿场景,但是如何定位到具体卡顿原因呢。

首先了解卡顿问题定位工具,然后再了解常见的卡顿原因,即可通过复现卡顿场景的同时,用工具去定位具体卡顿问题。

重点就是,充分利用gfxinfo输出的帧信息,对卡顿问题进行分类。

了解了高效定位卡顿的方法和卡顿问题定位工具,再熟悉一下常见的卡顿原因,可以更熟练的定位和优化卡顿。

SurfaceFlinger 负责 Surface 的合成,一旦 SurfaceFlinger 主线程调用超时,就会产生掉帧。
SurfaceFlinger 主线程耗时会也会导致 hwc service 和 crtc 不能及时完成,也会阻塞应用的 binder 调用,如 dequeueBuffer、queueBuffer 等。

后台进程活动太多,会导致系统非常繁忙,cpu io memory 等资源都会被占用,这时候很容易出现卡顿问题,这也是系统这边经常会碰到的问题。
mpsys cpuinfo 可以查看一段时间内 cpu 的使用情况:

当线程为 Runnable 状态的时候,调度器如果迟迟不能对齐进行调度,那么就会产生长时间的 Runnable 线程状态,导致错过 Vsync 而产生流畅性问题。

system_server 的 AMS 锁和 WMS 锁 , 在系统异常的情况下 , 会变得非常严重 , 如下图所示 , 许多系统的关键任务都被阻塞 , 等待锁的释放 , 这时候如果有 App 发来的 Binder 请求带锁 , 那么也会进入等待状态 , 这时候 App 就会产生性能问题 ; 如果此时做 Window 动画 , 那么 system_server 的这些锁也会导致窗口动画卡顿。

Android P 修改了 Layer 的计算方法 , 把这部分放到了 SurfaceFlinger 主线程去执行, 如果后台 Layer 过多,就会导致 SurfaceFlinger 在执行 rebuildLayerStacks 的时候耗时 , 导致 SurfaceFlinger 主线程执行时间过长。

主线程执行 Input Animation Measure Layout Draw decodeBitmap 等操作超时都会导致卡顿 。

Activity resume 的时候, 与 AMS 通信要持有 AMS 锁, 这时候如果碰到后台比较繁忙的时候, 等锁操作就会比较耗时, 导致部分场景因为这个卡顿, 比如多任务手势操作。

应用里面涉及到 WebView 的时候, 如果页面比较复杂, WebView 的性能就会比较差, 从而造成卡顿。

如果屏幕帧率和系统的 fps 不相符 , 那么有可能会导致画面不是那么顺畅. 比如使用 90 Hz 的屏幕搭配 60 fps 的动画。

由上面的分析可知对象分配、垃圾回收(GC)、线程调度以及Binder调用 是Android系统中常见的卡顿原因,因此卡顿优化主要以下几种方法,更多的要结合具体的应用来进行:

在计算机和通信领域,帧是一个包括“帧同步串行”的数字数据传输单元或数字数据包。
在视频领域,电影、电视、数字视频等可视为随时间连续变换的许多张画面,其中帧是指每一张画面。

C. 安卓手机卡顿怎么办

安卓手机卡顿怎么办1

1、首先在应用市场中下载安装360手机助手。

2、打开360手机助手切换到管理标签。

3、在页面顶端点击立即体检,检查手机的情况。

4、点击深度清理按钮。

5、对手机进行一键清理加速。

6、完成后可以体验到手机使用的速度变快了。

安卓手机卡顿怎么办2

1、安卓系统代码开源

众所周知安卓系统最大优势是开源,系统源码可以被公众使用并且对其修改和发行,允许任何移动终端厂商和开发者加入到Android联盟中来。但是开源同样也存在着弊端,那就是应用质量参差不齐以及标准杂乱无章。

开源大大降低了安卓系统开发者的门槛,而一个单纯功能的简单应用由于代码质量粗糙,很可能要占用200MB RAM。如果手机运存只有2GB,卡顿会变得特别明显。

我们操作安卓手机的时候,有时候点开一个浏览器软件,后台会自动唤醒有利益相关的`几款APP,即使安卓原生系统也无能为力。毕竟这一机制后面,是彼此应用的利益链条,而对于国内应用市场,谷歌更是鞭长莫及。大量的程序运行势必拖慢了手机的运行速度,手机操作起来就无法顺畅。

2、系统沉淀垃圾

微信作为如今最常用通讯软件,安卓版安装包大小是30MB;不过半年以后再去看这个应用,它的内存占用可以达到500MB甚至更多。这种情况在视频软件里随处可见,尤其一些社交和音乐/视频应用。积年累月当应用把手机存储快要堆满了,系统运行速度肯定越来越慢。

3、系统版本无法升级

根据报告显示,在去年末Android5.0及其以上(Android 5.1和Android 6.0)的市场份额仅占全部安卓阵营的26%。换句话说,三分之二的用户还停留在Android 4.X时代,为什么强调这个分水岭,要从Android5.0说起。Android 5.0系统即彻底从Dalvik转换到ART,在系统转换以前:应用在运行的过程中,虚拟机Dalvik通过一个叫JIT(Just-in-time)的解释器动态的进行编译并执行,这种虚拟机模式会大大拖慢系统的运行效率。作为对比,ART模式则是在用户安装应用时就进行预编译操作,将原本在程序运行中时的编译动作提前到应用安装时。在省去解释代码这一过程之后,应用的运行效率会更高。

完成这种更新延迟的根本在于很多厂商在手机售出之后很少进行系统升级推送,同时大量消费者又没有更新手机系统的习惯。很多手机系统卡在Android4.4,而越来越多的新应用却是为了适配更高系统打造的,所以手机卡顿不可避免。

卡顿了用户需要怎么做

怎样解决手机越用越卡?第一需要有一台能保障系统定期更新的手机;在这一基础上定期对手机内存清理,把碎片和部分缓存信息清理干净。更进一步操作还会利用到系统自带防火墙或者第三方自启动管理软件,根据使用习惯屏蔽一部分自启动应用。

当然通读全文,不难发觉随着日积月累,手机卡顿现阶段在所难免。而用户自身,甚至是手机厂商能做的,是把这个卡顿的时间点不断推迟。我们只能寄希望于那些技术开发者,早日研究出不会卡顿的手机。

D. 手机卡顿如何解决

如果您使用的是华为手机,手机升级系统后短时间内出现卡顿,属于正常现象,如果并非刚升级完出现,请按照以下方案排查:
温馨提醒:升级系统后卡顿原因:由于系统升级后刚开始使用时,系统会对设备中的应用程序进行优化,此时设备负载较高,使用时可能会出现卡顿情况。建议升级完成后将手机灭屏充电2小时以上,然后重启以保证设备内已安装的应用优化完成。
1.清理存储空间和运行内存
手机运行内存和存储空间不足时会导致应用卡顿,建议您进入手机管家进行清理:
(1)进入手机管家点击清理加速,待扫描完毕后,点击清理项后的立即清理,根据提示删除多余的文件,并卸载不常用的应用,保持存储空间充足(建议预留20%以上)。
(2)进入手机管家点击一键优化/立即优化,优化完毕后,手机管家会显示优化结果以及设置建议。根据提示,完成相应的设置。

2.重启手机
请您重启手机后尝试。重启能够结束正在运行的应用程序,缓解卡顿现象。
3.检查手机是否发热或者充电时使用
手机特有的过热保护功能会适当降低系统性能。建议您尽量避免充电时使用手机,适当降低屏幕亮度,关闭不使用或异常耗电应用与功能,如“蓝牙”,NFC等。
4.检查存储卡
(1)可能是存储卡硬件异常,是否曾提示“存储卡异常”,若是,建议您尽快更换存储卡。(2)可能是存储卡存储的文件过多(建议预留10%以上空间),导致读写速度慢,建议您清理存储卡空间,或备份重要数据(QQ、微信等第三方应用需单独备份)后格式化存储卡。
(3)若手机的默认存储位置为存储卡,建议您将默认存储位置更改为“内部存储”后尝试。
5.关闭省电模式、保持电量充足
如果您开启了省电模式,建议您关闭(设置 > 电池 > 省电模式和 超级省电),并保持电量充足(20%以上)。省电模式和低电量情况下,手机会降低性能以节省电量。
6.卸载第三方手机管家类软件
(1)如果您的设备装有第三方管理类型的软件,请卸载此类应用后尝试。通常此类软件与设备自带的手机管家存在冲突,会导致运行卡顿。
(2)检查是否为使用三方应用时卡顿,建议您向三方应用反馈或致电华为客服。
7.检查手机是否正在下载、复制、传输等操作
如果手机正在执行上传下载(文件、图片、视频、应用等)、复制(文件管理拷贝数据等)、传输(手机克隆、Huawei Share等)等操作时感觉到卡顿,建议您等待任务结束或停止此操作。
提示:您可以下拉状态栏查看上传、下载、传输文件的进度。
8. 升级系统版本
建议您备份重要数据(QQ、微信等第三方应用需单独备份)及时进行设备系统更新,并将应用升级到最新版本。新版本会对系统性能进行优化提升。更新方法:进入设置,搜索进入软件更新,点击检查更新。
9. 恢复出厂设置
请您备份重要数据(QQ、微信等第三方应用需单独备份),将手机恢复出厂设置后重试。
如果问题仍然存在,请您备份好数据后(QQ、微信等第三方应用需单独备份)携带购机凭证前往华为客户服务中心进行检测处理。
温馨提醒:您可以选择夜间充电(或灭屏充电40min以上),可以一定程度上整理手机内存碎片,缓解卡顿现象。

相关链接如下:预约服务寄修服务华为客户服务中心维修备件价格查询

阅读全文

与androidapp卡顿原因相关的资料

热点内容
中国移动营业app怎么看套餐 浏览:205
javastatic数组 浏览:950
需要会员管理源码 浏览:415
手机app如何解除加密 浏览:167
用云服务器还得买个瘦主机 浏览:728
如何查看办公电脑服务器地址 浏览:368
海星云的服务器是什么系统 浏览:411
抖音小笼包解压神器 浏览:558
手机下载的源码在哪里储存 浏览:846
pdf看三维 浏览:406
九宫算法干什么用的 浏览:907
phpjava性能比较 浏览:886
2016会计中级pdf 浏览:181
农村信用社app怎么删除明细 浏览:817
学而思电脑怎么下载app 浏览:107
php防止mysql注入 浏览:233
磁力计校正算法 浏览:491
解压缩后变小了 浏览:957
智友文件夹 浏览:81
android操作系统开发的操作系统 浏览:480