浅析安卓(Android)的性能优化
作者:爱小丽
Android性能的优化主要分为两点
1、布局优化
2、内存优化
布局优化
首先来看一下布局优化,系统在渲染UI的时候会消耗大量的资源,所以,对布局的优化就显得尤为重要
避免Overdraw
也就是避免过度的绘制,过度的绘制会浪费更多的资源,举个例子,Android系统会默认绘制Activity
的背景,这时候我们再设置一个背景,这样默认的背景就属于过度绘制了,在『开发者工具』中有一个『调试GPU过度绘制』的选项,我们打开就可以通过颜色来判断过度绘制的次数
如图:
所以说我们尽可能的增大蓝色区域,减少红色区域
优化布局层级
在Android系统中,系统对View进行测量、布局、绘制的时候,都是通过对View
树的遍历来进行的,所以说一个布局的层级太多,就会严重影响测量、布局、绘制的速度,所以要降低View树的高度,Google在文档中建议布局的层级不超过10层,所以还要避免嵌套没有用的布局
使用include标签
相信大家都会在项目的时候遇到toolbar,或者一个UI在多个界面使用的问题,遇到这种问题的时候我们一般都会用include(毕竟大神『第一行代码』教的好),这样就减少了代码冗余,而且还利于后期更改
使用ViewStub实现View的延时加载
ViewStub
标签和View.GONE
的方式差不多,但是ViewStub
只会在显示的时候去渲染,而GONE
在初始化的时候就已经渲染完毕了,所以相比来说ViewStub
的效率更高。
下面来通过代码使用一下ViewStub
首先我们定义一个布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
这里面只放了一个TextView
,然后我们在自己的布局中通过ViewStub
来引用他
<Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ViewStub android:id="@+id/vs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout="@layout/view_stub"/>
这里的逻辑是点击按钮然后出现ViewStub
引用的布局(也就是我们上面写的那个布局文件)
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ViewStub vs = (ViewStub) findViewById(R.id.vs); View vsView = vs.inflate(); TextView tv = (TextView) vsView.findViewById(R.id.tv); tv.setText("hahaha"); } });
这里想要把ViewStub
引用的布局显示出来有两种办法,一种是ViewStub.setVisibility();
另一种就是ViewStub.inflate();
这两种方法的区别就是inflate()
能返回引用的布局,然后可以通过这个布局来找到里面的子View
来进行操作
运行程序点击按钮,就可以看到TextView
已经显示出来了,并且已经赋值『hahaha』
Hierarchy Viewer
这个工具可以显示我们的布局,但是只可以在模拟器和工厂的Demo机上用,不过Google的大神提供了一个开源的项目ViewServer,有兴趣的可以看一下。
这个就不过多阐述了,有兴趣的可以自行查看一下相关的资料
内存优化
我们都知道,最近Android的厂商就是在拼配置,其中我们最关注的就是内存几个G,但是Android手机有的内存很大,但是很卡,这是因为有的手机软件在手机内存低的情况下不能被杀死,也就是我们说的『防杀』
我们知道内存一般分为这几个部分
1、寄存器
2、栈
3、堆
4、静态存储区
5、常量池
其中寄存器运算速度最快,但是我们在程序里无法控制
栈里存放基本数据类型
堆里存放对象和数组,在堆中的一般由Java的GC还管理
静态存储区在固定的位置存放应用程序中运行时一直存在的数据,Java专门划分了一个区域来管理静态变量
常量池就是该类型所使用到的常量的集合
Bitmap的优化
我们都知道在Android中是造成OOM的最大威胁,因为它占用的内存特别多,所以我们应该:
1、使用适当分辨率大小的图片
由于Android在做适配的时候会对不同分辨率的文件夹下的图片来进行缩放适配,如果图片的分辨率与资源分辨率不匹配的话就会导致消耗更多的资源
2、使用缓存
一般有内存缓存和硬盘缓存
代码优化
1、对常量使用static
2、使用静态方法,静态方法比普通方法提高15%左右的访问速度
3、减少没有必要的成员变量,如果能定义成局部变量就最好定义成局部变量
4、减少不必要的对象
5、少用枚举、迭代器
6、对Cursor
、Receiver
、File
等对象,要注意回收和取消注册
7、使用SurfaceView
来代替View进行大量并且频繁的绘图操作
8、尽量使用视图缓存,不是每次都执行inflate()
来解析视图
9、避免使用反射
10、使用RenderScript
、OpenGL
来进行非常复杂的绘图操作
总结
以上就是对Android性能优化的一些点,如果你用AndroidStudio的话,AndroidStudio提供了一个内存监视的工具,还是很好用的,如果你没用AndroidStudio,那么我建议你使用AndroidStudio~
另外优化也没有绝对的完美,每一次优化都是基于当前的环境来做的,要明白沟通是最好的优化,不盲从,不随便,三思而后行。希望这篇文章对大家开发Android能有所帮助。