一、内存优化的目的以及工具介绍
内存对于移动设备来说是一种稀缺资源。
Android内存不足带来的问题:OOM;UI不流畅
内存
指标:占用,泄露多少
UI流畅度
指标:帧数,响应时间
IO
指标:阻塞式响应时间
DDMS工具(Eclipse环境)
Heaps
Heap size
Allocated
Allocation Tracker
MAT(Memory Analyzer)
Leak Suspects 内存泄露报告
Top Consumers 占用者报告
Histogram 每个Class占用内存
Dominator Tree:列出那些对象占用内存最多,以及谁在保留这些对象。
android.os.Debug
内存测试的步骤:
1. 编译代码
2. 选定测试场景(来自于经验&开发)
3. 测试场景转换成用例
4. 跑起工具Run用例
5. 结合代码,分析
二、Android APP内存的主要问题分析与总结
1、Static——常见于单例模式
2、多线程生命周期过长,导致本该释放的资源没有释放
3、大胖子Bitmap
4、Cursor——不能单单close
开发人员能做的:
1. 及时的销毁
2. 设置一定的采样率
3. 巧妙地运用软引用(SoftReference)
private ImageView preview;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);
preview.setImageBitmap(bitmap);
- Cursor用完记得关掉;CursorAdapter可以再onDestroy中关掉。
protected void onDestroy() {
if (mAdapter != null && mAdapter.getCursor() != null) {
mAdapter.getCursor().close();
}
super.onDestroy();
}
三、UI绘制原理以及量化工具
影响UI流畅度的原因:
1. 主线程干的活太多,UI没时间来相应用户操作。
2. 阻塞式方法执行时间过长。
3. 不太合理的UI绘制方式,导致新的UI显示出来时出现顿挫感。
同时了解下Android怎么绘制UI:
1. 读取XML(inflate)
2. 计算大小(measure)
3. 布局坐标计算(layout)
4. 绘制到屏幕(draw)
其中2、3两步最为耗时。
垂直同步
四、如何获取应用的UI流畅度
五、IO对性能的影响
1. SQLite,xml类
优点:稳定、可靠、保证原子性
缺点:效率低
Read
(1)异步化——不要阻塞在主线程
(2)预判+缓存——在listview中预加载下面的item到缓存
(3)避免复杂的查询语句
Write
(1)异步化
(2)仅支持文件锁
(3)善用索引
(4)善用SQLite事务机制
(5)善用UPDATE…WHERE…
2. 文件类
优点:简单、快速
缺点:无原子性保证