Android 性能优化总结

看了很多关于优化的介绍,最近项目也正处于这个阶段,看的太多太杂难免有些混乱,所以就整理记录下来,方便以后学习。

一、界面优化:

(1).使用开发者选项中的[调试GPU过度绘制]根据显示的颜色判断

(2).使用开发者选项中的[GPU呈现模式分析]根据条形图,检测绘制失帧情况

(3).查看层级结构可以用HierarchyViewer的工具进行分析

(4).通过使用 Lint 来查找可能的布局优化。Lint 现在已经代替了 Layoutopt,而且更有效率

(5).避免过多无用的嵌套可以使用标签重用layout 和 <ViewStub>延迟加载

二、内存优化:

1、减少内存的占用

(1)、使用FaceBook开源的图片加载框架Fresco,内存的申请放在了匿名共享内存中

(2)、可以通过Android Studio 中的Android Monitor Memory 查看内存占用情况和Gc回收的频率

2、内存泄漏:使用LeakCanary可以帮助我们发现问题然后用内存分析工具 MAT(Memory Analyzer Tool) 进行分析定位

常见的内存泄漏有:

(1)、非静态内部类的静态实例容易造成内存泄漏

(2)、activity使用静态成员

(3)、使用handler时的内存问题

(4)、注册某个对象后未反注册

(5)、集合中对象没清理造成的内存泄露

(6)、资源对象没关闭造成的内存泄露

(7)、Bitmap使用不当

三、数据优化:

1、优秀的网络请求框架如: Volley 、OkHttp、 Retrofit

2、优秀的数据解析框架如: Jackson 、Gjson

3、引入缓存机制

4、数据库优化:

(1)、建立索引

(2)、编译SQL语句

(3)、显示的使用事务

(4)、按需获取数据列信息

(5)、提前获取列索引

(6)、ContentValues的容量调整

(7)、及时关闭Cursor

(8)、耗时异步化

四、减少GC次数:

GC会引起性能卡顿,也需要重点优化:

1、减少对象分配,找出不必要的对象分配,如可以使用非包装类型的时候,使用了包装类型;字符串的+号和扩容;

Handler.post(Runnable r)等频繁使用。

2、对象的复用,对于频繁分配的对象需要使用复用池。

3、尽早释放无用对象的引用,特别是大对象和集合对象,通过置为NULL,及时回收。

4、防止泄露,除了最基本的文件、流、数据库、网络访问等都要记得关闭以及unRegister自己注册的一些事件外,

还要尽量少的使用静态变量和单例。

5、控制finalize方法的使用,在高频率函数中使用重写了finalize的类,会加重GC负担,使得性能上有几倍的差别。

6、合理选择容器,在性能上优先考虑数组,即使我们现在习惯了使用容器,也要注意频繁使用容器在性能上的隐患点:首先是扩容开销, HashMap扩容时重新Hash的开销较大。其次是内存开销,HashMap需要额外的Map.Entry对象分配 ,需要额外内存,也容易产生更多的内存碎片。SparseArray和ArrayList等在内存方面更有优势。再次是遍历,对于实现了RandomAccess接口的容器如ArryList的遍历,不应该使用foreach循环。

7、用工具监控和精雕细琢:在页面滑动过程中,通过Memory Monitor查看内存波动和GC情况,

还可通过AlloCation Tracker工具观察内存的分配,发现很多小对象的分配问题。

8、利用Trace For OpenGL工具找出界面上导致硬件加速耗时的点,例如一些圆角图片的处理等。

五、代码优化:

1、对常量使用static修饰符

2、使用静态方法

3、减少不必要的成员变量

4、尽量不要使用枚举,少用迭代器

5、对Cursor、Receiver、Sensor、File等对象,要注意它们的创建、回收与注册、反注册

6、避免大量使用注解、反射

7、使用RenderScript、OpenGL来进行复杂的绘图操作

8、使用SurfaceView来替代View进行大量、频繁的绘图操作

9、尽量使用视图缓存,而不是每次都执行inflate()方法解析视图

10、创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。

11、将类、变量、方法等等的可见性修改为最小。

12、针对字符串的拼接,使用StringBuffer替代String。

13、不要在循环当中声明临时变量,不要在循环中捕获异常。

14、如果对于线程安全没有要求,尽量使用线程不安全的集合对象。

15、使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。

16、文件读取操作需要使用缓存类,及时关闭文件。

17、慎用异常,使用异常会导致性能降低。

18、如果程序会频繁创建线程,则可以考虑使用线程池。

六、相关链接:

给App提速:Android 性能优化总结
10 条提升 Android 性能的建议
LeakCanary 检测内存泄漏
LeakCanary 中文使用说明
手机淘宝性能优化项目揭秘
Android中SQLite 性能优化


你可能感兴趣的:(Android开发进阶)