Andriod性能优化笔记
布局优化
布局优化的思想很简单,就是尽量减少布局文件的层级。
如何进行布局优化呢?首先是删除布局中无用的空间和层级,其次有选择地使用性能较低的 ViewGroup,比如 RelativeLayout 的性能比起 LinearLayout 和 FrameLayout 就不是很好。
利用 RelativeLayout 可以减少嵌套,因为嵌套意味着增加了布局的层级。
另外,还可以使用以下几个标签
-
标签 布局重用
-
标签 减少布局层级
-
ViewStub
按需加载
绘制优化
绘制优化是指 View 的 onDraw 方法要避免执行大量的操作。体现在两个方面
-
onDraw 中不要创建新的局部对象
如果 onDraw 被频繁调用,会在一瞬间产生大量临时变量,会占用过多内存和导致频繁 GC。
-
onDraw 中不要做耗时任务,也不能执行成千上万次的循环操作
View 的绘制帧率保持在 60 fps 是最佳的
内存泄漏优化
常见例子:
-
静态变量导致的内存泄漏
public class MainActivity extends Activity { private static Context sContext; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... sContext = this; } }
public class MainActivity extends Activity { private static View sView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... sView = new View(this); } }
-
单例模式导致的内存泄漏
Activity 实现某个接口并向单例 Test 注册监听。由于缺少解注册的操作所以会引起内存泄漏。因为 Activity 的对象被单例 Test 所持有,而单例模式的特点是生命周期和 Application 保持一致。因此 Activity 的对象无法被及时释放。
-
属性动画导致的内存泄漏
属性动画中有一类无限循环动画,如果没有在 onDestroy() 中停止动画,那么动画会一直播放下去,尽管已经无法在界面上看到动画效果了。而且这个时候,Activity 的 View 被动画持有,而 View 又持有了 Activity,最终 Activity 无法被释放。
解决办法:在 Activity 的 onDestroy 中调用 animator.cancel() 来停止动画。
响应速度优化
核心思想是避免在主线程中做耗时操作。否则就会出现 ANR。
ANR 发生的时候,系统会在 /data/anr 目录下创建一个文件 traces.txt,可以利用 MAT 来分析这个文件找出原因。