关于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来完成的。

 

提高程序可维护性

代码风格、代码层次性、单一职责原则的应用、面向扩展的编程以及设计模式的运用等,都跟程序的可维护性息息相关,都是实际开发总需要总结提高的内容。

关于Android的性能优化

上一篇:UpdateAppHttpUtils


下一篇:h5的localStorage在ios环境不好用,iphoneX适配,vue兄弟间传值等随笔