安卓优化差,安卓卡顿优化方法
首先,我们先了解UI优化的解析:在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,
首先,我们先了解UI优化的解析:
在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小。
概述:其实我们在开发好后的app,在使用过程中,经常会看到程序动画卡顿的现象; Android 应用的卡顿,丢帧等,这些影响用户体验的因素绝大部分都与 16ms 这个值有关。我们来讨论下 UI 渲染方面影响应用流畅性的因素。
16ms定义:Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。为什么是16ms, 因为Android设定的刷新率是60FPS(Frame Per Second), 也就是每秒60帧的刷新率, 约合16ms刷新一次。
UI卡顿的原理:Android每16ms就会绘制一次Activity,通过上述的结论我们知道,如果由于一些原因导致了我们的逻辑、CPU耗时、GPU耗时大于16ms,UI就无法完成一次绘制,那么就会造成卡顿。
卡顿原因与解决方案:一、过度绘制
1.去除不必要的背景色:
设置窗口背景色为通用背景色,去除根布局背景色若页面背景色与通用背景色不一致,在页面渲染完成后移除窗口背景色去除和列表背景色相同的Item背景色2.布局视图树扁平化:
移除嵌套布局使用merge、include标签使用性能消耗更小布局(ConstraintLayout)3.减少透明色,即alpha属性的使用:
通过使用半透明颜色值(#77000000)代替二、UI 线程的复杂运算
UI线程的复杂运算会造成UI无响应, 当然更多的是造成UI响应停滞, 卡顿。产生ANR已经是卡顿的极致了
解决方案:运算阻塞导致的卡顿的分析, 可以使用 Traceview 这个工具。
三、频繁的 GC
频繁GC的原因:
内存抖动(Memory Churn), 即大量的对象被创建又在短时间内马上被释放。瞬间产生大量的对象会严重占用 Young Generation 的内存区域, 当达到阀值, 剩余空间不够的时候, 也会触发 GC。即使每次分配的对象需要占用很少的内存,但是叠加在一起会增加 Heap 的压力, 从而触发更多的 GC。解决方案:瞬间大量产生对象一般是因为我们在代码的循环中 new 对象, 或是在 onDraw 中创建对象等, 尽量不要在循环中大量地使用局部变量。
过度绘制检测:
在Android手机的"系统设置"-->"开发者选项"-->"调试GPU过度绘制"-->"显示GPU过度绘制"中开启调试。蓝色,淡绿,淡红,深红代表了4种不同程度的过度绘制(Overdraw)情况。蓝色: 意味着overdraw 1倍,像素绘制了两次。大片的蓝色还是可以接受的(若整个窗口是蓝色的,可以摆脱一层)。绿色: 意味着overdraw 2倍,像素绘制了三次。中等大小的绿色区域是可以接受的,你应该尝试优化、减少它们。淡红: 意味着overdraw 3倍,像素绘制了四次,小范围可以接受。深红: 意味着overdraw 4倍,像素绘制了五次或者更多。这是不可接受的,要修复它们。我们的目标就是尽量减少红色 Overdraw,最理想的是蓝色,一个像素只绘制一次,合格的页面绘制是白色、蓝色为主,绿色以上区域不能超过整个的三分之一,颜色越浅越好。四丶耗时操作
使用AsyncTask,Thread,HandlerThread,HandlerThread,IntentService等手段将耗时操作移出UI线程。
注意:如果你自己开启线程,你应该调用Process.setThreadPriority() 并传入THREAD_PRIORITY_BACKGROUND 设置线程的priority为"background"。如果不这样做,你开启的线程仍然有可能拖慢你的app,因为默认情况下它与UI线程的优先级相同。
优化思路:
使用成员变量保存引用使用对象池进行复用五丶线程过多
显然,这对于app的性能是有负面影响的。线程再多,CPU的资源是有限的,CPU在同一时间能够运行的线程数是不多的, 其他所有的线程都只能等待,同时,每个线程至少需要占用64K的内存。过多的线程只会带来对内存和CPU资源的激烈竞争。
优化思路:建立线程池统一管理
总结以上所说:这是常见的一些卡顿现象,以及解决的方案。当然还有可滚动列表丶layout等等一系列现象。后续我会一一讲解。有关更多面经、核心技术笔记;自己也是从事Android开发5年有余了;整理了一些Android开发技术核心笔记和面经题纲,如有需要的同学请私信我回复“核心笔记”或“面试”领取!
Android UI卡顿原因及解决办法
渲染机制介绍为了分析UI卡顿,我们有必要理解一下渲染机制,这套渲染机制适用于绝大部分的屏幕渲染,其中包括Android手机等众多屏幕设备。
渲染的一些重要参数:
屏幕刷新理想的频率(硬件的角度):60Hz
理想的一秒内绘制的帧数,帧率(屏幕刷新的角度):60fps
这两个参数都是理想值,指代的都是同一个概念。实际情况中难免会比它们低。在60fps内,系统会得到发送的VSYNC(垂直刷新/绘制)信号去进行渲染,就会正常地绘制出我们需要的图形界面。Android手机进行绘制的时候,GPU帮助我们将UI组件等计算成纹理Texture和三维图形Polygons,同时会使用OpenGL---会将纹理和Polygons缓存在GPU内存里面。
其中,VSYNC:有两个概念
Refresh Rate:屏幕在一秒时间内刷新屏幕的次数----有硬件的参数决定,比如60HZ,即屏幕每秒刷新60次
Frame Rate:GPU在一秒内绘制操作的帧数,比如:60fps,
基本结论
要达到60fps,就要求:每一帧只能停留16ms。(大概就是1000ms/60 ~= 16ms刷新一次)
内存抖动是因为大量的对象被创建又在短时间内马上被释放。
瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。
Android里面是一个三级Generation的内存模型,最近分配的对象会存放在Young Generation区域,当这个对象在这个区域停留的时间达到一定程度,它会被移动到Old Generation,最后到Permanent Generation区域。
Android每个16ms就会绘制一次Activity,通过上述的结论我们知道,如果由于一些原因导致了我们的逻辑、CPU耗时、GPU耗时大于16ms( 应用卡顿的根源就在于16ms内不能完成绘制渲染合成过程,16ms需要完成视图树的所有测量、布局、绘制渲染及合成 ),UI就无法完成一次绘制,那么就会造成卡顿。
比如说,在16ms内,发生了频繁的GC:
在第一个16ms内,UI正常地完成了绘制,那么屏幕不会卡顿。
在第二个16ms内,由于某些原因触发了频发的GC,UI无法在16ms内完成绘制,就会卡顿。
UI卡顿外部和内部常见原因
下面总结一些常见的UI卡顿原因:
1.内存抖动的问题
2.方法太耗时了(CPU占用)
1) CPU计算时间,CPU的测量、布局时间
2)CPU将计算好的Polygons和Texture传递到GPU的时候也需要时间。OpenGL ES API允许数据上传到GPU后可以对数据进行保存,缓存到display list。因此,我们平移等操作一个view是几乎不怎么耗时的 。
3) GPU进行格栅化
当我们的布局是用的FrameLayout的时候,我们可以把它改成merge,可以避免自己的帧布局和系统的ContentFrameLayout帧布局重叠造成重复计算(measure和layout)。
使用ViewStub:当加载的时候才会占用。不加载的时候就是隐藏的,仅仅占用位置。
CPU优化建议
针对CPU的优化,从减轻加工View对象成Polygons和Texture来下手:
View Hierarchy中包涵了太多的没有用的view,这些view根本就不会显示在屏幕上面,一旦触发测量和布局操作,就会拖累应用的性能表现。那么我们就需要利用工具进行分析。
如何找出里面没用的view呢?或者减少不必要的view嵌套。
我们利用工具:Hierarchy Viewer进行检测,优化思想是:查看自己的布局,层次是否很深以及渲染比较耗时,然后想办法能否减少层级以及优化每一个View的渲染时间。
我们打开APP,然后打开Android Device Monitor,然后切换到Hierarchy Viewer面板。除了看层次结构之外,还可以看到一些耗时的信息:
三个圆点分别代表:测量、布局、绘制三个阶段的性能表现。
1)绿色:渲染的管道阶段,这个视图的渲染速度快于至少一半的其他的视图。
2)黄色:渲染速度比较慢的50%。
3)红色:渲染速度非常慢。
GPU优化建议就是一句话:尽量避免过度绘制(overdraw)
一、背景经常容易造成过度绘制。
手机开发者选项里面找到工具:Debug GPU overdraw,其中,不同颜色代表了绘制了几次:
安卓手机怎样解决卡顿?
vivo手机卡顿处理方法:1、升级系统版本
系统新版本提升了兼容性和稳定性,优化了性能,进入设置--系统升级(部分机型为:设置--我的设备--iQOO UI版本),可以查看系统版本信息。如果不是最新版本,建议您升级体验。
2、重启手机
定期重启一次手机(比如2-3天),重启能有效的清理缓存,缓解卡顿现象。
3、检查手机是否发热
进入i管家--更多--手机降温,查看下手机温度是否较高?手机温度较高时会适当降低系统性能,以减少运行功耗和发热,可能暂时出现卡顿现象。建议您尽量避免充电时使用手机,适当降低屏幕亮度,关闭不使用的后台应用与功能,如蓝牙、个人热点等。
4、检查省电模式和电量情况
低电模式或低电量情况下,手机会降低部分性能以延长续航时间,如果开启了低电模式(设置--电池--低电模式),建议您切换为正常模式(设置--电池--正常模式),并保持电量充足(20%以上)。
5、清理存储空间
手机运行内存和存储空间不足时可能导致卡顿,可以使用以下方法清理:
①使用“一键加速”清理已不使用的后台应用,使手机处于更好的状态;
②进入手机i管家点击一键优化/继续优化,优化完毕后,手机i管家会显示优化结果以及设置建议。根据提示,完成相应的设置;
③进入手机i管家点击空间清理,等待扫描完毕后,点击“一键放心清理”删除垃圾缓存文件,并按照页面推荐,卸载不常用的应用,保持存储空间充足(建议预留20%以上可用空间)。
6、检查更新软件
如果是第三方应用卡顿,进入应用商店--管理--应用更新,尝试更新软件。最新版本一般解决了应用本身的一些兼容性问题,使用最新版本,可以保证您的最佳体验。
7、卸载重装软件
应用数据过多或有异常时会导致应用卡顿,卸载重装软件可以改善因数据异常导致的应用卡顿问题,操作前请您提前备份软件的重要数据。
8、恢复出厂设置
建议您备份好重要数据后,将手机恢复出厂设置后重试。操作方法:进入设置--系统管理--备份与重置--清除所有数据(部分机型为:设置--更多设置--恢复出厂设置--清除所有数据),点击进入并根据屏幕提示操作。清除所有数据会将手机恢复至初始状态,删除手机系统空间中的所有数据,包括帐号、系统及应用数据和设置、已安装的应用,请在操作前,及时备份您的数据。
文章评论