Android APP性能优化

来源:互联网 发布:apache2.4加载php模块 编辑:程序博客网 时间:2024/05/01 13:13

1. 为什么需要性能优化?

上面说到,在时间窗口期内开发出产品是极端重要的,但是虽然基本功能我们实现了,但是开发出来的产品代码运行的效率怎么样呢?我们的App用户给用户的体验如何呢?

我们的App在低端机上经常ANR、闪退、卡顿等

我们的App在其他分辨率上显示惨不忍睹?

我们的App在不同网络的情况下如何处理的?

 

我们的App体验如此之差,导致大量的用户流失。这些迫使我们认识到性能优化是非常重要,某种程度上甚至超过了新功能的开发。

 

2性能优化四个方面:

- 响应时间(Response Time

- 界面卡顿(ANR

- 耗内存(Memory

- 内存泄露(Out of memory)

 

响应时间

1HTTP请求方式

这里指的是客户端与服务端交互,拿到数据、解析、再到显示到界面整个过程耗费的时间。

这个部分涉及客户端的优化,也涉及服务端的优化,这里只讨论客户端。

 

使用优秀的开源Http框架是我们比较好的选择,它的优点是经过市场的验证. 加快响应速度(网络请求框架)。

 

2)数据解析

实际开发当中服务端的返回数据格式无非就两种:

- JSON

- XML

Android中均可以使用优秀的解析库来加快我们的解析速度XML中有dom4jJSONJacksonGson,我们通过这些库实现我们更快的完成数据解析,提高我们的开发效率。

 

3)数据存储

为了提高应用程序的响应时间,数据缓存是一个比较好的方式,我们可以预处理服务器返回的数据,对数据进行缓存刷新

 

优化点:

- 异步请求网络数据

- 预处理服务器返回数据

- 异步进行数据存储操作

- 数据缓存刷新

- Timeout超时重试

- 在主线程中操作UI

 

 

界面卡顿

ANR表示”应用程序无响应”,这个是需要我们避免发生的事情,出现这个异常的原因:

- 主线程 (“事件处理线程”/UI线程”)5秒内没有响应输入事件

- BroadcastReceiver10秒内没有执行完毕

 

导致ANR的原因有很多,一般情况就是在UI线程做了耗时的操作,例如”网络请求”、数据库操作。

 

那么如何避免?

- UI线程只做界面刷新,不做任何耗时操作,耗时操作放在子线程来做

- 可以使用Thread+handle或者AsyncTask来进行逻辑处理

 

耗内存

每部手机的内存有限,我们这里所说的内存指的是手机的RAM,它是Ramdom Access Memory的缩写,我们应用程序的需要随机读写的数据就存在RAM中,Android手机之所以会比较耗内存,这跟Android后台的处理有关,我们知道Android应用是使用Java开发的,运行Java需要有虚拟机,说明每开启一个应用都会创建一个虚拟机,而这是需要内存的,所以我们开的应用越多,后台进程越多,内存都分配出去了,才导致内存消耗的严重。

随机存取存储器(random access memoryRAM)又称作"随机存储器",是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。

其实这个问题我们是没得破的,只要内存不够,我们的应用还是会卡。我们开发的应用依赖与系统给我们分配的堆内存,一般上限在16M~48M,但我们可以通过在AndroidManifest设置Application属性largeHeap=true”来申请更多的堆内存

可以通过代码获取可用堆内存限制

 

内存泄露

内存泄露这个问题已经被说烂了,大家都知道有内存泄露这个问题存在,但为什么会发生内存泄露?

这里的内存泄露并不是真正意思上的泄露,而是因为内存不足不能进行GC操作,从而导致占用内存过大,抛出out of memory异常,而被系统Kill掉。(内存泄露进而导致内存溢出)

 

3,如何进行性能优化?

前面讲了一些背景知识,对我们理解内存优化有一定的帮助,下面就简单说一下我们优化的方向:

- 布局优化

- 内存优化

 

布局优化

优化点:

- 避免OverDraw

- 优化布局层级

- 避免过多无用嵌套

- 使用标签 重用layout

- 使用延迟加载

- Hierarchy View进行层级分析

 

内存优化

内存优化的点有很多,这里我主要分为两大块:

- Bitmap优化

- 代码优化

 

代码优化

关于代码这个就有的说了,任何能改进我们程序的优化点都能写在这里,这里没办法把所有优化的点列在这里,只提供相关的参考,剩下的就好各位经验总结和积累了。

优化点:

- 对常量使用static修饰符

- 使用静态方法

- 减少不必要的成员变量

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

- CursorReceiverSensorFile等对象,要注意它们的创建、回收与注册、反注册

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

- 使用RenderScriptOpenGL来进行复杂的绘图操作

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

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

 

创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。 将类、变量、方法等等的可见性修改为最小。 针对字符串的拼接,使用StringBuffer替代String。 不要在循环当中声明临时变量,不要在循环中捕获异常。 如果对于线程安全没有要求,尽量使用线程不安全的集合对象。 使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。 文件读取操作需要使用缓存类,及时关闭文件。 慎用异常,使用异常会导致性能降低。 如果程序会频繁创建线程,则可以考虑使用线程池。

 

以上都是些经验总结,大致都相差无几,朋友们在做代码优化的时候,可以根据这些优化点,有针对性去重构代码,其实最重要还是代码的可读性,结构清晰。

 

性能优化工具


Memory Monitor - 内存监视工具 TraceView MAT

Android开发者对与以上几个性能调优的工具一定不陌生,这里我也不再写那么多废话了,关于它们的使用方法,官网还有一些大牛的博客都有介绍。

 

写这篇文章的出发点也是对Android性能优化有个比较清楚的认识,任何事情都不可能一蹴而就,需要循循渐进,对一个初学者你谈优化很不现实,我们先把基本的做好,再去考虑相应的优化,笔者也在不断学习当中,借鉴别人好的优化方案,提高产品的质量,感谢大家对笔者的关注。

 

性能优化技术,简而言之,就是提高我们程序的性能,让我们的应用更快,更少使用CPU资源,更少使用内存。

性能优化,一方面需要自身能力的提高,另外一方面,也需要有意识去学习优化技术,并应用于自身项目的开发中。

原创粉丝点击