Android性能优化之必备篇

前言

一个N年的Android开发工程师究竟跟一个一两年经验的开发工程师的区别在哪里?第一,技术上会有区别,这个众所周知,我不多做赘述。但是,我认为更重要的一点,就是在开发细节上,有些错误的东西是你从一开始就养成的习惯,如果没人告知,其实很难意识到。今天我就从Android的开发细节上说说性能的优化。

正文

一般来说,Android优化可以分为三类。布局优化,内存优化,渲染优化。

布局优化

1.布局优化-减少视图层级数

首先说说布局优化,当我们拿到UI设计稿的时候,不应该盲目的就开始写,应该先想一想,我们用什么样的布局最合适。在Android4.x的时代,AndroidStudio默认将新建项目MainActivity的布局设置为一个LinearLayout,后来改成了RelativeLayout,有些同学可能没有注意过这个细节,那既然我说出来了,大家不妨想一想,为什么Google官方要做这样的替换呢?其原因当然是考虑到性能了,首先,LinearLayout会对控件测量1次,而RelativeLayout会对控件测量2次,试想,如果控件数量非常多,一个页面上百个,那么这个工作量可是有差别的,即便CPU的速度越来越快,那也是要耗时的,作为一名高级程序员,我们就要精益求精。那么问题来了,明明LinearLayout比RelativeLayout少一次,为什么还要替换呢?因为我们现在市面上的app的布局都十分花哨,有时需要层层嵌套,而相比层层嵌套,性能更优的还是测量2次,因此,如果布局用LinearLayout可以完成且嵌套层数在2层或2层以下,那么推荐用LinearLayout,因为测量的次数少一次。但是绝大多数时候,只嵌套2层完全没法满足需求,因此在布局较为复杂的时候,推荐使用RelativeLayout,减少布局嵌套的层数,可以大大的优化性能。

2.ViewStub

相信我们都遇到过这样的需求,某一个功能只对特定的人群开放,有些用户永远不可能看到该功能。面对这样的需求,新手的第一想法可能是,写一个控件,动态的setVisibility不就行了。的确,可以实现,但是,从性能的角度,并不是完美的。因为LayoutInflater在加载的时候,看到一个控件,比如Button,即便是gone的状态,也是会inflate的,会占用内存和系统资源。这种时候,一定要有限考虑使用ViewStub这个视图,它可以延迟加载,只有在你调用inflate()方法之后才会真正的加载,具体用法可以自行百度,这里不多做赘述,只讲方法。

3.使用merge标签

我们肯定使用过<include>标签来进行重复布局的引用,在这个过程中会产生冗余的父布局,可以使用merge标签来进行合并。

4.减少视图数量

注意,这跟减少视图层级不一样,这里说的是数量,举个例子,UI设计的输入框左边有一个装饰图标,那我们就不要用两个控件去写,用一个输入框,增加个drawableStart属性,引入资源即可,通过源码我们能够看到,drawableStart在EditText中仅仅是一个Drawable的引用,但是如果我们用两个控件,将大大增加开销,也许还需要增加父布局来包裹起来,性能大大降低。再比如,同一行文本,姓名:XXX,这里姓名和XXX的颜色是不一样的,我们也不要使用两个控件,使用图文混排,SpannableStringBuilder来实现前后文本不一样颜色,不一样背景,加粗,下划线等等效果,性能也是远远大于多个控件的。

内存优化

1.避免内存泄漏
其实这点可以作为一个专题来讲的,这里我只是简单列举,过几天我会写一个避免内存泄漏的专题文章。比如,慎重使用static,资源对象用完记得释放,单例造成的内存泄漏,线程造成的内存泄漏,Handler造成的内存泄漏等等。
2.减少使用依赖注入
虽然这种方式是框架的常见的设计模式,可以用来解耦,使代码更加整洁清晰,但是同时也带来了更大的资源消耗,因为一般这种框架都会用到大量的反射,而反射是十分消耗性能的。
3.Context对象尽量使用Application的Context
这是因为Application的Context是只要程序运行就一直存在的,生命周期是整个进程的生命周期。尤其是单例模式,如果引用了context对象,要十分注意,非常容易出现内存泄漏的现象。

性能优化

1.避免过度绘制
我们在手机上看到的所有东西都是靠GPU渲染出来的,当然了,GPU渲染界面是需要花时间的,如果渲染每帧的时间超过16ms,那么就会出现一卡一卡的现象。相信玩游戏的同学都知道,FPS如果过低的话就会很不流畅,其中的道理是一样的。那我们怎么避免过度绘制呢,首先我们要知道什么是过度绘制。举个例子,你用一个LinearLayout包裹了两个TextView,然后你将这三个控件的背景都设置成为了白色,那么GPU在渲染的时候,会将这三个控件都渲染一遍,无形中就浪费了资源,重叠的那部分就是过度绘制,如果遇到十分复杂的布局,你也不注意的话,那么造成的浪费会非常严重。检查过度绘制的方法可以使用手机自带的Debug GPU Overdraw,具体打开方法可以自行百度,红色的部分越少越好。
2.减少布局的嵌套
尽量不要层层嵌套布局,尽量简化你的布局,减少控件的数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值