您的位置:首页 > 移动开发 > Android开发

[置顶] Android性能优化笔记

2016-01-10 13:01 375 查看
最近拜读了《Android群英传》这本书,感觉其中的《Android性能优化》这一章总结得很好,在这里我会结合自己的体会写一篇自己关于这一章的笔记,在其中加入一些自己的注解。

1. 布局优化

1.1 Android UI渲染机制

在Android中我们的渲染事件最好都在16ms以内,如果在16ms内未完成绘制,那么就会造成丢帧现象,造成画面卡顿的现象。Android系统提供了检测UI渲染时间的工具,打开“开发者选项”,选择“GPU呈现模式分析”(也就是Profile GPU Rendering),并选中“在屏幕上显示为条形图”(也就是On screen as bars)。我们在这里可以看见一条水平的绿线,我们要在操作APP的过程中,保持所有的条形图都在这条绿线下。如果在某个时间点突然超过了绿线,我们就不妨检查一下那个时间点的绘制是不是可以优化了。我测试了一下360手机助手,发现这个APP也有一些时刻出现了超过绿线的情况;自己的APP更是有不少情况超过了绿线,看来优化的幅度还有很大。

1.2 避免Overdraw

overdraw指的是过度绘制。同样地,在开发者选项中提供了这样一个检测工具:调试GPU过度绘制(也就是Enable GPU Overdraw)。通过图案的颜色,颜色为红色的区域,说明这里的绘图层次较深,如果可以的话,我们可以对这个区域的绘图进行简化。

1.3 优化布局层次,避免嵌套过多无用布局

嵌套的布局会让View树的高度变得越来越高,会严重影响测量,布局和绘制的速度。我们可以考虑多使用RelativeLayout等布局来优化我们的层级关系,让View树的高度适当降低。

1.4 使用 < include > 标签重用layout

对于每个Activity的Topbar或者Bottombar来说,肯定有很多共同的UI,在每个界面中都来复制一段这样的代码,不利于后期代码的维护,也增加了程序的冗余度。我们可以使用< include>标签来定义一个共同的UI。

1.5 使用 < ViewStub>实现View的延迟加载

我们还可以使用< ViewStub>标签来实现一个View的引用并实现延迟加载。< ViewStub>是一个非常轻量级的组件,它不仅不可视,而且大小为0。一旦我们把ViewStub 放在Activity的布局中,它是默认不可见的。我们可以通过逻辑去设置它为visible或者inflate它,从而让它成为我们的这个ViewStub代表的layout。乍一看,它和我们在布局中设置为gone的效果是差不多的。它们的不同之处是:ViewStub标签代表的布局只会在显示的时候,才会去渲染整个布局,而我们的View.GONE,则是在初始化的时候就已经添加在布局树上了,相比之下我们的ViewStub具有更高的效率。

1.6 Hierarchy Viewer检查布局

使用位于我们的sdk\tools\hierarchyviewer.bat 文件,它可以查看我们当前Activity的布局冗余情况。一般情况下,如果一个布局没有其它的分支,那么它很可能是一个冗余的布局。详细信息我们可以到http://developer.android.com/sdk/index.html去了解。这个工具可以对我们布局优化起到很大的作用。

2. 内存优化

2.1 Bitmap优化

Bitmap是造成内存占用过高(oom)的最大威胁。一旦我们使用完Bitmap后,我们最好调用bitmap.recycle()方法来释放它的内存资源。还有一点,由于Android系统在做资源适配的时候会对不同分辨率文件夹下的图片进行缩放来适配相应的分辨率,如果图片分辨率与资源文件夹分辨率不匹配或者图片分辨率太高,会导致大量的内存被占用。所以,应当在适当的地方显示合适大小的图片。

2.2 代码优化

任何java类,将占用500字节的内存空间。创建一个类的实例会消耗大约15字节的内存。在代码角度,我们有很多地方对内存进行优化。

(1)对常量使用static修饰符。

(2)使用静态方法,静态方法会比普通方法提高15%左右的访问速度。

(3)减少不必要的成员变量,变量尽量定义为局部变量。

(4)减少不必要的变量。

(5)尽量不要使用枚举变量(enum)。

(6)对Cursor,Receiver,File等对象,要注意它们的回收与解注册。

(7)使用SurfaceView代替View进行大量频繁的绘图工作。

2.3 Android各种内存方面的工具

在这里,我大概总结一下我们所使用到的关于内存方面的工具。我个人使用的最多是Android Studio自带的Memory Monitor工具。因为是Android Studio自带的,它使用起来较为便捷,相信大家都使用过。同时,还有TraceView和MAT等工具供我们使用,不过这个我不是很熟悉,等我熟悉一下它们,再进行总结。我使用过一个开源库叫做leakcanary,它可以监控我们的内存泄露问题,感兴趣的同学可以到这个地址https://github.com/square/leakcanary 去了解一下。

3.总结

其实我Android学习也没有多长时间,在公司虽然也是自己承担一个Android APP的开发,但是主要工作是大量的业务逻辑的堆砌,对于Android 开发的理解还亟需增加。而内存的管理,则是一个很重要的模块,在这里我对它们进行一个总结(并没有对细节做太多描述,而是记录每个点对自己做一个提醒),希望自己在开发过程中,可以注意到这些要点,提升自己的APP的用户体验,在低端机上运行得更加流畅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: