Android 性能优化总结
2015-12-18 14:28
465 查看
看了很多关于优化的介绍,最近项目也正处于这个阶段,看的太多太杂难免有些混乱,所以就整理记录下来,方便以后学习。
(2).使用开发者选项中的[GPU呈现模式分析]根据条形图,检测绘制失帧情况
(3).查看层级结构可以用HierarchyViewer的工具进行分析
(4).通过使用 Lint 来查找可能的布局优化。Lint 现在已经代替了 Layoutopt,而且更有效率
(5).避免过多无用的嵌套可以使用<include>标签重用layout 和
<ViewStub>延迟加载
(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使用不当
2、优秀的数据解析框架如: Jackson 、Gjson
3、引入缓存机制
4、数据库优化:
(1)、建立索引
(2)、编译SQL语句
(3)、显示的使用事务
(4)、按需获取数据列信息
(5)、提前获取列索引
(6)、ContentValues的容量调整
(7)、及时关闭Cursor
(8)、耗时异步化
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工具找出界面上导致硬件加速耗时的点,例如一些圆角图片的处理等。
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、如果程序会频繁创建线程,则可以考虑使用线程池。
10 条提升 Android 性能的建议
LeakCanary 检测内存泄漏
LeakCanary 中文使用说明
手机淘宝性能优化项目揭秘
Android中SQLite 性能优化
一、界面优化:
(1).使用开发者选项中的[调试GPU过度绘制]根据显示的颜色判断(2).使用开发者选项中的[GPU呈现模式分析]根据条形图,检测绘制失帧情况
(3).查看层级结构可以用HierarchyViewer的工具进行分析
(4).通过使用 Lint 来查找可能的布局优化。Lint 现在已经代替了 Layoutopt,而且更有效率
(5).避免过多无用的嵌套可以使用<include>标签重用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、 Retrofit2、优秀的数据解析框架如: 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 NumberPicker和DatePicker分割线颜色设置
- Android的onCreateOptionsMenu()创建菜单Menu详解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- Android多媒体应用
- Android打包说明
- Android系统权限那些事
- 第1章 Android简介与开发环境的配置
- Android -- TouchDelegate
- Android加密之非对称加密算法
- android 简单粗暴的注解初始化View学习
- android icon 大小设计原则
- Android消息处理机制
- Android蓝牙开发经验总结(二)
- android获得屏幕高度和宽度
- Android ActionBar Home按钮返回事件处理的两种方式
- Android Studio中获取sha1证书指纹数据的方法
- 关于Android中工作者线程的思考
- Android开发如何去除标题栏title(转)
- android studio导入开源项目问题记录
- 进击的Android之manifests
- Android-->Retrofit 2.0 beta2 使用方法