很多App都会遇到以下几个常见的性能问题:

启动速度慢;界面跳转慢;事件响应慢;滑动和动画卡顿。

一、启动速度优化。

优化初始化任务:

1. 把一些初始化任务懒加载初始化

2. 把初始化任务并行化(异步化)

3. 使初始化任务可以插拔(一个任务出问题不会影响到其他的任务)

其他:

1. 控制线程数量,注意线程的使用,用自己的线程池替换三方或者二方SDK的线程池,线程太多占用cpu资源,

2. 使用缓存来减少I/O操作(读数据库,读文件,SharedPreference)减少网络请求(判断无网络直接返回)

3. 对于SharedPreference进行了专门的优化,减少单个文件的大小,将毫无联系的存储键值分开到不同文件中,

并且防止将大数据块存储到SharedPreference中,这样既不利于性能也不利于内存,

因为SharedPreference会有额外的一份缓存长期存在。

4. Activity使用热启动,在按Back键,不销毁activity,释放一些图片等占用内存大的资源

二、界面优化

布局复杂、过渡绘制多、Activity主要函数耗时、内容展示慢、界面重新布局(Layout)、GC次数

这些问题会导致界面卡顿。

1. 过度绘制

Activity使用默认主题背景,在layout中view尽量减少背景的设置(有前景内容,就不要设置和展示背景),

减少多层布局结构背景设置,减少Drawable的复杂Shape使用。

2. 优化布局层级

层级越多,测量和布局的时间就会相应增加,创建硬件列表的时间也会相应增加。

有时我们会嵌套很多布局来实现原本只要简单布局就可以实现的功能,有时还会添加一些测试阶段才会使用的布局。

通过删除无用的层级,使用Merge标签或者ViewStub标签来优化整个布局性能。比如一些显示错误界面、加载提示框界面等,

不是必须显示的这些布局可以使用ViewStub标签来提升性能。 另外要灵活使用布局,并不是层级越多就会性能越差,

有时候1层的RelativeLayout会比3层嵌套的LinearLayout实现的性能更糟糕。

除了灵活使用布局,另外我们还通过提前inflate以及在线程中做一些必要的inflate等来提前初始化布局,

减少实际显示时候的耗时。对于一些复杂的布局,做复用池,减少inflate带来的性能损耗,特别是在列表中。

3. 加快界面展示

1. 减少主线程的GC停顿,因为即使并行GC,也会对heap加锁,如果主线程请求分配内存的话,也会被挂起,

避免在onDraw中频繁分配较多和较大的对象,去掉ListView ,ScrollView等控件的EdgeEffect效果,来减少内存分配和加快控件的创建时间

2. 可以通过TraceView工具找出主线程的耗时操作以及操作次数和其他耗时的线程并作优化;

3.  对于网络请求,做好本地缓存,在网速慢或者无网络的时候展示,减少不必要的数据协议字段,减少名字长度等,并作压缩。

还可以通过分页加载数据来加快传输解析时间。因为JSON越大,传输和解析时间也会越久,引发的内存对象分配也会越多;

4. 注意线程的优先级,对于占用CPU较多时间的函数,也要判断线程的优先级。

5. 重写方法requestLayout、onSizeChanged,如果大小没有变化就阻断过多Layout请求。

4. 减少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循环。

5.  用性能分析工具采集数据,分析数据,找出性能优化点

通过Memory Monitor查看内存波动和GC情况,还可通过AlloCation Tracker工具观察内存的分配,发现很多小对象的分配问题。

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

使用TraceView分析方法耗时,开启GPU过度绘制监视以及GPU呈现模式使用Systrace分析界面渲染问题。

6.  编码时优化点

灵活使用final关键字,避免在循环中使用try catch,尽量少用Enum类型,可以使用临时变量代替this.member等

7. 测试启动时间方式

log方式在oncreate和onwindowFocus打点,记录Activity启动到界面展示的时间

可以使用hock方式记录启动时间,使用测试网站来测试,

 android 5.0以上 使用adb shell am start -W 来测试时间。

Android性能优化篇的更多相关文章

  1. 【转】Android性能优化之布局优化篇

     转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...

  2. Android性能优化第(三)篇---MAT比Menmery Monitor更强大

    作者 LooperJing 2016.11.17 16:42* 字数 1687 阅读 1603评论 3喜欢 21 在Android性能优化第(一)篇---基本概念中讲了JAVA的四大引用,讲了一下GC ...

  3. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  4. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  5. (转)Android性能优化——工具篇

    Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...

  6. 【腾讯Bugly干货分享】Android性能优化典范——第6季

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...

  7. Android性能优化文章转载

    今天看到几篇比较好的文章就转了!(链接如下) 转载注明出处:Sunzxyong Android性能优化之Bitmap的内存优化 Android性能优化之常见的内存泄漏 Android最佳实践之Syst ...

  8. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/   Android性能优化典范 - 第5季 htt ...

  9. Android性能优化之布局优化

    最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...

随机推荐

  1. oracle: tochar(sysdate,'D')函数

    学习oracle时碰到tochar(sysdate,'D')函数,但是发现并不是星期几,如今天是20150317,周二,但是得到的值为3 开始以为是系统日期什么的原因,试了试 select to_ch ...

  2. 白话学习MVC(七)Action的执行一

    一.概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理.对于MVC来说,请求是先 ...

  3. Django,数据模型创建之数据库API参考(转载)

    一旦 数据模型 创建完毕, 自然会有存取数据的需要.本文档介绍了由 models 衍生而来的数据库抽象API,及如何创建,得到及更新对象. 贯穿本参考, 我们都会引用下面的民意测验(Poll)应用程序 ...

  4. 以Debug模式启动JBoss

    JBoss服务器的启动方法: 假设JBoss的安装目录为$JBOSS_HOME,Windows以及Linux环境下的Debug模式的启动方法分别为:Windows环境:找到Windows下的JBoss ...

  5. delphi关闭程序Close,application.Terminate与halt区别

    当Close是一个主窗体时,程序会退出.Close会发生FormClose事件,FormCloseQuery事件Halt会发生FormDestory事件,Application.Terminate以上 ...

  6. js web实现移动端触控

    // 触摸事件 $(".m_l_i_l a").on("touchstart", function(){ $(this).css("color&quo ...

  7. [原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. android Thread和Service的区别

    http://www.cnblogs.com/devinzhang/archive/2012/01/11/2319433.html (zhuan)

  9. viewpaper 抽屉

    引用:http://www.apkbus.com/android-18384-1-1.html 在为ViewFlipper视图切换增加动画和Android中实现视图随手势移动中实现了视图随手势切换,现 ...

  10. 从表中删除重复记录的sql

    --有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...