为什么要进行性能优化
Android设备作为一种移动设备,不管是在内存还是CPU的性能都受到一定的限制,无法做到像PC设备那样的超大内存和高性能CPU,鉴于这一点,就意味着android无法毫无限制的使用内存和CPU资源,过多的使用内存会导致程序内存泄露即OOM;而过多的使用CPU,一般指做大量的耗时任务,会导致设备变得卡顿甚至出现程序无响应的情况即ANR。因此,android程序的性能问题就变得异常突出,这对开发人员也提出了更高的要求。
Android的内存管理方式##
- Android的内存分配和回收机制
一个进程对应一个虚拟机,可以通过dumpsys meminfo命令去查看指定的进程内存信息
可以参考http://blog.csdn.net/hudashi/article/details/7050897
GC操作只有在Heap Free空间不够的情况下才会自动触发垃圾回收;
GC操作触发时也是需要消耗CPU时间的,如果时间过长会影响程序的运行,同时在该操作触发时所有的线程都会被暂停; - App内存限制机制
每个App分配的最大内存限制,随不同设备而不同,可以通过ActivityManager的getMemoryClass方法获取到允许的最大内存;
内存大户:图片;
为什么要限制?原因在于Android设备是多任务系统,多个App可以同时存在,如果不做限制的话,容易导致内存被占光,导致其他APP无法运行; - 切换应用时后台App清理机制
App切换时使用的是Lru Cache算法-----缓存淘汰算法,Least Recently Used的缩写,即最近最久未使用的意思,最近使用的排在前面,最少可能的会被清理掉;
onTrimMemory()回调,在内存变化时触发,在该方法中检测到内存不够时可以做相应处理; - 监控内存的几种方法
通过代码 Runtime的totalMemory freeMemory等方法获取
通过Android Studio的Android Monitor工具或者Tools工具栏的Android Device Monitor可以看到相应的信息
性能优化的方法
为了解决性能问题,开发人员提出了一系列的优化方法,主要包括布局优化,绘制优化,内存泄露优化,响应速度优化,listview优化,BitMap优化,线程优化以及一些性能优化建议;
- 布局优化
其主体思想就是尽量减少布局文件的层级;很显然,层级减少,就意味着Android绘制的工作量少了,自然性能就高了。
如何进行布局优化?
首先删除布局中无用的控件和层级。
其次有选择的使用性能较低的ViewGroup,如RelativeLayout。由于RelativeLayout的功能较复杂,其布局过程需要花费更多的CPU时间,而LinearLayout和FrameLayout是一种简单高效的布局。如果简单的Viewgroup不能实现,需要嵌套使用的方式来完成的场景下还是建议使用RelativeLayout,因为嵌套就意味着增加了布局的层级,同样会降低程序的性能;
最后是采用标签,标签和ViewStub;
标签主要用于布局重用
标签一般和配合使用,可以减少布局层级
ViewStub则提供按需加载功能,需要时才会将ViewStub的布局加载到内存,这提高了程序的初始化效率。 - 绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作
首先onDraw中不要创建新的局部对象,因为ondraw可能会被频繁调用
其次 onDraw不要做耗时任务,也不能执行成千上万的循环操作。大量的循环会抢占CPU时间片,造成View的绘制不流畅。按Google给出的标准Vi