性能优化
布局优化
Android Ui渲染机制
人眼觉得流程的画面,需要达到40帧/s 到 60帧/s 。安卓中,系统通过 VSYNC信号触发对UI的渲染,重绘,间隔时间是16ms(1s显示60帧的时间)。所以,我们需要保证16ms内完成ui的绘制,否则会造成丢帧,下次信号才开始开始绘制该帧,导致连续两个16ms都显示同一帧画面,从而造成卡顿。
Android系统提供ui渲染时间检测工具,在手机上,打开开发者选项,选择Profile GPU Rending ,并选中on screen as bars ,就显示条形图,展示渲染ui时的一些数据。具体内容见书中。
布局优化
避免 Overdraw
Overdraw,过渡绘制,会造成GPU和CPU资源的浪费。例如系统默认会绘制Activity的背景,如果再给布局绘制了重叠的背景,那么系统默认绘制的背景就是默认的过渡绘制。Android系统开发者选项中,有一个过渡绘制的检测工具-“Enable GPU Overdraw”,激活后,可以通过界面上的颜色判断Overdraw的次数。
这里是 具体介绍 overdraw的文章
优化布局层级
系统通过对view进行测量,绘制,布局时,都会遍历view树。所以我们view嵌套太多,会导致树太高,严重影响效率。文档建议树的高度一般不超过10层。
在选择layout组件时,应该考虑该组件的特点来进行选择使用,否则会嵌套无用布局,增加view树的高度。这种嵌套无用布局问题在初学时,经常出现,应该尽早避免。
使用< include>标签重用布局
在实习的时候,有的项目就使用include来重用 topbar,当时只是简单的使用,而没有进行思考为什么这样使用。
在一个应用中,为了保持风格统一,有很多共通的ui,例如
topbar,bottombar,比起简单的粘贴复制代码到每一个布局,include是不错的选择。
使用include注意:
- 布局的heigth和 width都设为 0dp,让调用者自己设置大小。
- 最好不要在共通的ui中使用某个特定layout组件才有的属性,因为我们的共通布局,不止服务于某个特定layout。
- < include>标签中可以覆盖原布局的属性,如果覆盖类似 layout_xx这样的属性,就必须同时指定layout_heigth和layout_width。
使用< ViewStub>实现延时加载
对于一些view的延时加载,之前使用的是 visivility属性,让view不可见或者可见,这样的做法对于简单view还可以接受,但对于复杂的view,是必须避免的。这样会把复杂的绘制都一次交给系统处理,导致资源紧张。所以采用 viewStub(不可见,大小为0),可以在不影响用户体验的情况下,让页面的绘制分批次进行。具体使用可以自行查阅资料。
布局优化工具
布局优化工具,Hierarchy VIewer,自己了解使用。
内存优化
App内存的使用,也是评价一个应用性能的重要指标
内存简介
由于安卓的沙箱机制,每个应用分配的内存大小,是有限度的。内存太低,就出发LMK-Low Memory Killer机制。
一般说的内存,就是手机的RAW,包含以下几部分
- 寄存器
- 栈
- 堆
- 静态储存区
获取Android系统内存信息
两个系统提供的工具,具体使用自行搜索
- Process Stats
- Meminfo
内存回收
java不需要手动管理系统资源,它创建了垃圾收集器线程来自动进行资源管理。这样可以降低开发人员对于内存管理的繁琐工作,但是也有问题。例如java的GC是开发者无法控制的,即使调用System.gc(),也只是建议系统gc,不一定被采纳。无法控制过程,就会导致一些对象无法被回收,导致内存泄露。
Bitmap优化
Bitmap是内存占用过高甚至OOM的最大威胁,一些使用技巧
- 使用适当分辨率的图片:这就是资源分辨率文件夹对应不同分辨率图片的重要性,如果二者分辨率不匹配或者图片分辨率过高,可能会导致内存资源消耗更多。同时,注意缩略图的使用,例如列表中使用缩略图,具体查看再使用原图。
- 即时回收内存:一般使用完bitmap后,要进行bitmap.recycle方法释放内存,但Android 3.0之后,bitmap被放置到堆中,就不用自行释放了。
- 使用图片缓存:使用内存缓存和硬盘缓存,可以更好的使用bitmap(不太了解意思)
代码优化
- 减少成员变量
- 减少不必要的对象
- 尽量不要使用枚举和迭代器
- 对于 Cursor,Receiver,SensormFile的使用,注意创建,回收,注册,注销操作,即使用后需要及时关闭
- 使用surfaceView来进行大量,频繁的画图
- 尽量使用视图缓存,而不是,每次都使用inflate()方法解析视图
- 非常复杂的绘图操作,使用RenderScript,OpenGL
工具推荐
- Lint:Android Studio 代码,布局提示工具
- Memory Monitor:Android Studio 实时内存监视工具,
- TraceView:可视化性能调查工具
- Android Device Monitor:分析内存的强力助手