关于Android的性能优化
Android性能优化
Android设备作为一种移动设备,不管是内存还是CPU的性能都受到一定的限制。过多地使用内存会导致程序内存溢出OOM;而过多地使用CPU资源,一般指做大量的耗时任务,会导致手机变得卡顿甚至出现程序无法响应的情况,即ANR。
Android性能优化方法
-
布局优化
尽量减少布局文件的层级,这意味着Android绘制的工作量减少,程序的性能就能得到提升。
-
删除布局中无用控件和层级,有选择地使用性能较低的ViewGroup比如RelativeLayout,因为RelativeLayout的功能比较复杂,布局过程需要花更多的CPU时间,所以可以尽量优先考虑LinearLayout和FrameLayout这些更简单高效的ViewGroup。但是有些时候仅仅通过一个LinearLayout或者FrameLayout无法实现产品效果,需要嵌套方式完成时,就还是需要使用RelativeLayout减少嵌套。
-
采用
<include>
标签、<merge>标签
和ViewStub。include标签主要用于布局重用;而merge标签一般和include标签配合使用,可以减少布局的层级;而ViewStub是提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存。这些都提高了程序的初始化效率。
-
-
绘制优化
View的onDraw方法要避免执行大量的操作。因为onDraw方法可能会被频繁调用,所以不要创建新的局部对象,否则会在一瞬间产生大量临时对象,占用过多内存,可能会导致系统更加频繁GC,降低程序的执行效率;另外不要做耗时任务。
-
内存泄露优化
-
静态变量导致的内存泄露
由于静态变量对对象的持有导致无法及时释放。
-
单例模式导致的内存泄露
由于单例模式生命周期和Application保持一致的特点使得被持有的对象无法及时被释放。
-
属性动画导致的内存泄露
Android3.0以后可以使用属性动画,但是如果使用属性动画中一类无限循环的动画,尽管在界面上已经无法看到动画效果了,但是这个时候Activity的View会被动画持有,而View又持有了Activity,最终Activity无法被释放。所以一定要及时调用animator.cancel()来停止动画。
-
-
响应速度优化和ANR日志分析
如果主线程中做太多操作,会导致Activity启动的时候出现黑屏现象,甚至出现ANR。Android规定,Activity如果5s无法响应屏幕触摸事件就会出现ANR,而Broadcast如果10s之内还没有执行完操作也会出现ANR。
实际开发中ANR很难从代码中发现问题,但是当一个进程出现了ANR以后,系统会在/data/anr目录下创建一个文件traces.txt,通过分析这个文件就能定位出ANR的原因。
-
ListView和BItmap优化
ListView的优化方法也适于GridView。
Bitmap的优化主要是通过BitmapFactory.Options来根据图片进行采样,采样过程包主要用到了BitmapFactory.Options的inSampleSize参数。
-
线程优化
线程优化的思想是采用线程池,避免程序中存在大量的Thread。通过线程的重用,避免线程的创建和销毁带来的性能开销;控制线程的最大并发数,避免大量线程因互相抢占资源而导致阻塞现象的发生等。
-
其他性能优化的注意点
-
避免创建过多的对象;
-
不要过多使用枚举,枚举占用的内存空间要比整型大;
-
常量使用static final修饰;
-
使用一些Android特有的数据结构,比如SparseArray和Pair等等,它们会具有更好的性能;
-
适当使用软引用和弱引用;
-
采用内存缓存和磁盘缓存;
-
尽量采用静态内部类,可以避免潜在的由于内部类而导致的内存泄露。
-
内存泄露分析MAT工具
主要就是Histogram可以直观看到内存中不同类型buffer的数量和占用内存的大小,而Dominator Tree可以把内存中对象按照从大到小的顺序进行排序,并且可以分析对象之间的引用关系,内存泄露就是通过Dominator Tree来完成的。
提高程序可维护性