一、简介

性能调优是开发中少不了的一个过程,同时也是一名优秀的程序员需要掌握的基本技能。下面我们来看一下在 Android 中可以从哪些方面来进行性能优化吧。

二、内存优化

内存是很重要的一个模块了,所以我也将其放在了第一位来说明。那么如何来优化我们应用的内存呢?

当应用内存不足时,将发生内存溢出。内存溢出会直接导致应用 crash。尽量减少应用的内存使用将很好的避免发生内存溢出。我们可以从如下方面优化内存:

1. 内存泄漏

首先我们应该确保我们的应用不存在内存泄漏的情况。内存泄漏是指长生命周期对象持有短生命周期对象的引用,而导致短生命周期对象无法及时释放的问题,例如一个静态变量持有某个 Activity 的引用而导致该 Activity 退出时无法被回收。

Android 中常见的内存泄漏场景有:

  • Handler
    我们可以使用静态内部类的 Handler,并让 Handler 只持有外层 Activity 的弱引用;在 Activity 不再需要时,可以手动清空对应 Handler 中的所有消息。
  • 打开的资源未关闭
    例如文件、数据库等,打开后都是需要关闭的。这类问题通常比较好排查,使用一些代码检查工具(如 lint 等)都可以帮助你找到未关闭的资源。
  • 注册的回调没有注销
    一些回调方法,通常命名如 registerCallback 对应有 unregisterCallback,addCallback 对应有 removeCallback。这些回调都是需要我们成对使用的,否则很可能产生内存泄漏。
  • 单例模式持有的引用
    通常单例对象都是 static 的,其生命周期都很长。当单例对象持有某个短生命周期对象的引用时,如某个 Activity,将导致该 Activity 无法被系统回收。
    我们应该手动清除 Activity 的引用,或者是当单例中需要上下文时,直接使用 Application 作为其上下文。
  • 静态成员持有的引用
    该引用对象如果不再需要使用,应该手动将引用置为 null。
  • 非静态内部类的静态实例
    非静态内部类对象会持有外部类的引用,如果该非静态内部类对象是静态的,也将导致外部类对象无法被回收。

2. 图片

  • 图片压缩:对于大图片,可以压缩后加载(图片压缩方法可自行百度)。
  • 图片使用完后,及时释放。
  • 图片素材放在合适的目录下,如 xxhdpi、xxxhdpi 等,系统加载不同目录下的图片资源时,会根据手机 dpi 对其进行一定的缩放。一张较大的图片放在较低的 dpi 目录下容易导致系统加载时又进行放大而带来很大的内存消耗。
  • 图片缓存:当图片众多时,可以使用 来管理,并设置恰当的池大小(通常图片框架中都有相似实现了)。
  • 善用开源的图片框架吧。

3. 使用合适和数据结构

选用合适的数据结构,往往不仅可以减少内存的使用,也可以加快运算速度。你需要了解 队列数组链表哈希表 等常见数据结构,并根据实际场景选用合适的数据结构。

这里介绍两个 Android 推荐使用的,类似 键值对 功能的类:SparseArrayArrayMap。相比 HashMap,它们占用更少的内存,且功能相似,虽然性能上略逊一筹,但在 1000 以下的数量级上,性能上的差异基本可以忽略,但内存占用将少很多。

4. 其它优化

  • 使用 int 代替枚举
    枚举本质还是对象,比 int 多使用两倍左右的内存。不过枚举也有其优势,我们可以考虑使用 int 来代替枚举而减少内存。
  • 使用对象池
    对于需要频繁创建和释放的对象,我们可以考虑使用对象池来管理,通过重用对象来避免反复的创建释放。
  • ListView 的复用
    这个老生常谈了,通过 ViewHolder 重用布局。或者使用 RecyclerView

三、布局优化

1. 尽量选择使用简单的布局

简单的控件加载起来更快,当简单的控件可以满足需求时,应尽量考虑使用简单的控件。

常用布局控件复杂度:FrameLayout < LinearLayout < RelativeLayout

2. 减少布局的嵌套层级

当布局的嵌套层级增大时,将大大减慢 xml 的解析速度,而影响到页面的显示。所以我们应当保证布局的嵌套层级尽可能的低。

3. 其它优化

  • 使用 include 标签重用布局。
  • 合理的使用 merge 标签,可优化布局的嵌套层级。
  • 使用 style 标签,抽离公共的风格,可减少代码量,也更易维护。
  • 使用 ViewStub,对于某些不常用的控件,可在需要的时候再进行加载。

四、UI 卡顿优化

UI 卡顿将直接影响到用户的使用体验,是很重要的一个优化环节。

1. ANR

ANR 即页面无响应,产生原因有:Activity 中超过 5s 无响应;BroadcastReceiver 中,前台广播超过 10s,后台广播超过 60s;Service 20s 未完成启动;ContentProvider 的 publish 在 10s 没进行完等。

解决方法:避免在 UI 线程中进行耗时的操作,注意四大组件的大多数回调均在主线程中。

2. View 绘制慢

Android 的渲染需要在 16ms 内完成,否则会产生卡顿的现象。

避免在 onDraw() 方法中进行任何耗时操作,包括频繁创建局部对象(最好不要在该方法中创建局部对象)等。

避免频繁触发 view 的 layout 方法,因为会重新测量和绘制。

3. 动画

避免在同一时间执行过多的动画,导致 CPU/GPU 负载过大。

实现动画时,可以考虑一些开源的优秀的动画框架。

尽量使用硬件加速来完成动画。

4. GC(垃圾回收)

由于 GC 时将挂起其它所有线程,所以频繁的 GC 将带来卡顿的现象。

避免频繁创建释放对象,避免内存负荷大将减少 GC 的频率。

五、其它优化

1. 线程池

开启一个新的线程花销是很大的,如果应用需要经常创建新的线程,就考虑使用线程池吧。通过重用旧的线程对象减少创建新线程的开销。

2. 网络

一个页面的数据尽可能的放在同一个接口里,从而减少网络访问的次数。

大量的数据可以使用分页加载、缓存等。

3. IO

尽量减少 IO 的访问次数,例如读取一个文件时,一个字节一个字节的读取的话将频繁的访问 IO,我们可以一次性读取更多的字节而减少 IO 访问次数。

同理,数据库也是这样。

4. 代码量

尽量精简我们的代码,移除无用的资源和代码,选择使用更轻量级的依赖库。这也将大大减小我们 apk 的体积。

5. 运算

例如进行乘 2、除 2 等操作时,使用位运算(左移、右移)比乘除运算效率将好很多。尤其是这个运算发生在某个较大的循环体内时。

对于一些操作,我们可以选择使用 预处理延时计算 的策略。

6. 异常、锁

try - catch 和加锁的操作都是较重量级的,我们可以尽量不使用它们。例如一些线程同步的场景中选择使用 原子类volatile 关键字代替锁。

如果需要使用的场景下,我们也应该尽量保证其粒度足够小,即其包含的语句尽量少。

7. 更多

更多性能优化的方法,大家也可以留言。

Android 性能优化总结相关推荐

  1. Android 性能优化

    为什么80%的码农都做不了架构师?>>>    原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...

  2. Android性能优化系列 + Android官方培训课程中文版

    Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 http: ...

  3. Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)

    前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...

  4. Android性能优化典范第二季

    原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...

  5. Android性能优化之渲染篇(一)

    前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...

  6. Android性能优化典范笔记(1)-GPU绘制性能优化

    Android性能优化典范笔记(1)-GPU绘制性能优化 你还可以再Github上找到我的这篇文章:https://github.com/onlynight/ReadmeDemo/tree/maste ...

  7. Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性.流畅性.稳定性等,是提高用户留存 ...

  8. Android性能优化

    Android性能优化 一.布局优化: 1.优化方式: 减少不必要嵌套,尽可能使用LinearLayout.ConstraintLayout等控件 减少颜色覆盖,子控件背景足够,不要在其父控件加颜色 ...

  9. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  10. 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )

    文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...

最新文章

  1. 《jQuery Mobile入门经典》—— 2.7 练习
  2. nodejs事务使用总结
  3. NEUQ 字符串 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  4. 一道非常棘手的 Java 面试题:i++ 是线程安全的吗
  5. activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递
  6. LeetCode 670 最大交换 (暴力+贪心、Python)
  7. PHP版_游戏扫码登录器程序源码
  8. ClassNotFoundException
  9. 中国银行业协会首席信息官高峰:银行函证区块链服务平台具备六大优势
  10. LeetCode路径问题
  11. vmware虚拟机安装gho版本系统
  12. Kafka 过期数据清理 详解
  13. 运放输入偏置电流方向_运算放大器+仪表放大器:如何为偏置电流提供直流回路?...
  14. RCP中设置view和editor的tilte字体
  15. 姓名降序排列语句c语言,sql语句升序降序排列20个
  16. 王道程序员求职宝典 pdf
  17. 第三篇:【重磅】呼叫中心运营指标KPI字典
  18. linux常用命令_Linux常用命令 unzip
  19. 使用eCharts做了一个中国地图的各地之间的线路连接
  20. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

热门文章

  1. 上下文flags特性参数复杂ListView(多种布局)获取应用名的拼音(首字母拼音滑动改变)PopupWindow
  2. python:打印九九乘法表、直角三角形、等腰三角形、正方形
  3. memoQ单机版入门指南(新)
  4. 现代电力电子学中的瞬态分析
  5. 使用java创建pdf 并返回流给前端
  6. 多人游戏对战技术(坦克大战、状态同步)
  7. Remix OS PC 版面向全球开放
  8. 连连看(源码及图片素材)
  9. 语义分割数据增强python代码
  10. 泪雪博客:WordPress 熊掌号专业问答资源推送插件