Android性能优化(一)

Android性能优化典范

1、大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。

从设计师的角度,他们希望App能够有更多的动画,图片等时尚元素来实现流畅的用户体验。

但是Android系统很有可能无法及时完成那些复杂的界面渲染操作。

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,

这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,

这意味着程序的大多数操作都必须在16ms内完成。

如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候就无法进行正常渲染,

这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面。

用户容易在UI执行动画或者滑动ListView的时候感知到卡顿不流畅,

是因为这里的操作相对复杂,容易发生丢帧的现象,从而感觉卡顿。

有很多原因可以导致丢帧,也许是因为你的layout太过复杂,无法在16ms内完成渲染,

有可能是因为你的UI上有层叠太多的绘制单元,还有可能是因为动画执行的次数过多。这些都会导致CPU或者GPU负载过重。

总结:尽量避免写过于复杂的layout,布局尽量简单明了,在写布局的时候一定要考虑性能问题,避免嵌套 重复 冗余。

2 、overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。

在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。

这就浪费大量的CPU以及GPU资源。

当设计上追求更华丽的视觉效果的时候,我们就容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈。

这很容易导致大量的性能问题,为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。

Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。

例如某个Activity有一个背景,然后里面的Layout又有自己的背景,同时子View又分别有自己的背景。

仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域,增加蓝色区域的占比。

这一措施能够显著提升程序性能。

总结:要避免布局重复的绘制,如果不是特别需要尽量避免多个view使用重复或不同的背景

3、虽然Android有自动管理内存的机制,但是对内存的不恰当使用仍然容易引起严重的性能问题。

在同一帧里面创建过多的对象是件需要特别引起注意的事情。

Android系统里面有一个Generational Heap Memory的模型,

系统会根据内存中不同的内存数据类型分别执行不同的GC操作。

例如,最近刚分配的对象会放在Young Generation区域,

这个区域的对象通常都是会快速被创建并且很快被销毁回收的,

同时这个区域的GC操作速度也是比Old Generation区域的GC操作速度更快的。

除了速度差异之外,执行GC操作的时候,任何线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。

通常来说,单个的GC并不会占用太多时间,但是大量不停的GC操作则会显著占用帧间隔时间(16ms)。

如果在帧间隔时间里面做了过多的GC操作,那么自然其他类似计算,渲染等操作的可用时间就变得少了。

导致GC频繁执行有两个原因:

1、Memory Churn内存抖动,内存抖动是因为大量的对象被创建又在短时间内马上被释放。
    2、瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,

也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,

从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。

总结:你需要避免在for循环里面分配对象占用内存,需要尝试把对象的创建移到循环体之外,

自定义View中的onDraw方法也需要引起注意,每次屏幕发生绘制以及动画执行过程中,

onDraw方法都会被调用到,避免在onDraw方法里面执行复杂的操作,避免创建对象。

对于那些无法避免需要创建对象的情况,我们可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,

但是这里需要注意结束使用之后,需要手动释放对象池中的对象。

4、虽然Java有自动回收的机制,可是这不意味着Java中不存在内存泄漏的问题,而内存泄漏会很容易导致严重的性能问题。

内存泄漏指的是那些程序不再使用的对象无法被GC识别,这样就导致这个对象一直留在内存当中,

占用了宝贵的内存空间。显然,这还使得每级Generation的内存区域可用空间变小,GC就会更容易被触发,从而引起性能问题。

5 、电量其实是目前手持设备最宝贵的资源之一,大多数设备都需要不断的充电来维持继续使用。

不幸的是,对于开发者来说,电量优化是他们最后才会考虑的的事情。但是可以确定的是,千万不能让你的应用成为消耗电量的大户。

Purdue University研究了最受欢迎的一些应用的电量消耗,

平均只有30%左右的电量是被程序最核心的方法例如绘制图片,摆放布局等等所使用掉的,

剩下的70%左右的电量是被上报数据,检查位置信息,定时检索后台广告信息所使用掉的。

如何平衡这两者的电量消耗,就显得非常重要了。

有下面一些措施能够显著减少电量的消耗:

1、我们应该尽量减少唤醒屏幕的次数与持续的时间,使用WakeLock来处理唤醒的问题,

能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态。
 2、某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以等到设备处于充电状态或者电量充足的时候才进行。
 3、  触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,

避免过多的无线信号引起的电量消耗。关于网络请求引起无线信号的电量消耗

时间: 2024-11-12 14:56:05

Android性能优化(一)的相关文章

Google 发布 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

Android性能优化的一些理解

前言 Android性能优化对Android程序的维护和拓展是有很大帮助的,我们知道Android手机不管是内存还是CPU都无法同PC相比,这也就意味着我们必须要谨慎的去使用内存和CPU资源.因为稍稍不注意可能就会引发诸如OOM.ANR.内存泄漏等问题,所以熟悉Android性能优化的几个方法可以有效地提高应用程序的性能,我们可能都能说出一些性能优化的方法,比如布局优化.绘制优化.线程优化等等,但是可能我们会忽视某些小细节,比如布局优化我们可能都知道可以使用< include >来减少布局的层

[Android Pro] Android性能优化典范第一季

reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议. 主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.下

Android性能优化典范第二季

Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓存,重用,PNG压缩,自定义View的性能,提升设置alpha之后View的渲染性能,以及Lint,StictMode等等工具的使用技巧.关于该课程的介绍可以查看该地址:https://www.udacity.com/course/android-performance--ud825. 未完

Android性能优化典范(一)

2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计师的

Android 性能优化探究

使用ViewStub动态加载布局,避免一些不经常的视图长期握住引用: ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象被置空:某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了. 2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中. 基于以上的特点,那么可以考虑使用ViewStub的情况有: 1. 在程序的运行期间,某个布局在Inf

Android性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计

Android性能优化之使用线程池

在写程序时有些异步程序只执行一遍就不需要了,为了方便经常会写下面的代码 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 这样new出来的匿名对象会存在一些问题 1.由于是匿名的,无法对它进行管理 2.如果需要多次执行这个操作就new多次,可能创建多个,占用系统资源 3.无法执行更多的操作 使用线程池的好处 1.可以重复利用存在的线程

Android 性能优化:多线程注

前言 Android 开发中多线程的必要性 理解 Android 多线程 MessageQueue Looper Handler HandlerThread Android 中为什么只允许在主线程更新 UI Android 系统为了避免过度复杂的线程安全问题特地规定只允许在主线程中更新 UI 而开发者为了避免上述问题需要注意的是 总结 Thanks 前言 Android Performance Patterns Season 5 主要介绍了 Android 多线程环境下的性能问题.通过介绍 An