Android App 性能优化方案

1. 为何须要性能优化?数据库

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

咱们的App在低端机上常常ANR、闪退、卡顿等安全

咱们的App在其余分辨率上显示惨不忍睹?性能优化

咱们的App在不一样网络的状况下如何处理的?服务器

 

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

 

2性能优化四个方面:框架

- 响应时间(Response Timedom

- 界面卡顿(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资源,更少使用内存。

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