前言

  • 在 Android开发中,性能优化策略十分重要
  • 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键
  • 本文全面讲解性能优化中的所有知识,献上一份 Android性能优化的详细攻略, 含:优化方向、原因 & 具体优化方案,希望你们会喜欢

文章较长,建议预留较长时间阅读 / 收藏


目录

示意图


1. 性能优化的目的

性能优化的目的是为了让应用程序App 更快、更稳定 & 更省。具体介绍如下:

  • 更快:应用程序 运行得更加流畅、不卡顿,能快速响应用户操作
  • 更稳定:应用程序 能 稳定运行 & 解决用户需求,在用户使用过程中不出现应用程序崩溃(Crash) 和 无响应(ANR)的问题
  • 更省:节省耗费的资源,包括 内存占有、电池量、网络资源等

2. 需优化的性能指标

针对上述目的,需优化的性能指标 含:流畅性、稳定性、资源节省性


3. 优化方向

  • 针对上述性能指标,本文主要讲解的优化方向如下:

  示意图

  • 下面,我将针对每一种性能指标,详细讲解其优化方案

4. 流畅性

  • 优化原因
    利于 减少使用中的卡顿、响应时间久等问题,给与用户一个操作流畅的体验
  • 优化方向
    主要针对3个方面优化:启动速度、页面显示速度、响应速度

4.1 启动速度

  • 优化原因(即 启动速度慢的原因)
    初次打开应用时,需加载很多资源 or 功能逻辑
  • 优化方案
    采用 异步加载(多线程)、分步加载、延期加载的策略,减少启动应用时加载的任务,从而提高启动速度

由于我们打开的页面大多是Activity,下面将给出加速启动Activity的方式

示意图

4.2 页面显示速度

  • 优化原因(即 页面显示速度慢的原因)
    a. 页面需绘制的内容(布局 & 控件)太多,从而导致页面测量时间过长
    b. 绘制效率过低,从而导致绘制时间过长

  • 优化方案 布局优化 & 绘制优化。具体请看文章:

  1. Android性能优化:手把手带你全面了解 绘制优化
  2. Android性能优化:布局优化 详细解析(含<include>、<ViewStub>、<merge>讲解 )

4.3 响应速度

  • 优化原因
    应用程序出现 ANR 情况,从而导致 应用程序响应速度慢

关于ANR的简介如下

示意图

  • 优化方案
    使用多线程,将大量 & 耗时操作放在工作线程中执行
  1. 多线程的方式 包括:AsyncTask、继承 Thread类、实现 Runnable接口、Handler消息机制、HandlerThread
  2. 注:实际开发中,当一个进程发生了ANR后,系统会在 /data/anr目录下创建一个文件 traces.txt,通过分析该文件可定位出ANR的原因

4.4 其他优化方案

  • 合理的刷新机制

    示意图

  • 动画的使用

    1. 根据不同场景选择 合适的动画框架
    2. 使用 硬件加速的方式 提高流畅度
    3. 使用动画后需停止动画

4.5 总结

下面,总结 关于流畅性的性能优化方案

示意图


5. 稳定性

  • 影响Android 应用稳定性的原因有很多,主要是:应用崩溃(Crash)、应用无响应(ANR)

这2个错误的结果将导致程序无法使用

  • 下面,将主要讲解该2个优化方向:应用崩溃(Crash)、应用无响应(ANR)

5.1 应用无响应(ANR)

  • 简介

示意图

  • 优化原理
    尽量避免应用程序出现 ANR 情况

  • 优化方案
    使用多线程,将大量 & 耗时操作放在工作线程中执行

  1. 多线程的方式 包括:AsyncTask、继承 Thread类、实现 Runnable接口、Handler消息机制、HandlerThread
  2. 关于多线程的使用,可看我写的关于多线程的文集:多线程系列
  3. 注:实际开发中,当一个进程发生了ANR后,系统会在 /data/anr目录下创建一个文件 traces.txt,通过分析该文件可定位出ANR的原因

5.2 应用崩溃(Crash)

  • 优化原理
    应用崩溃Crash很多情况是因为 内存溢出,即OOM;故 需避免出现 OOM现象

内存溢出 简介:

示意图

  • 优化方案
    关于内存优化,具体请看文章:Android性能优化:这是一份全面&详细的内存优化指南

5.3 总结

下面,总结 关于稳定性的性能优化方案

示意图


6. 资源节省性

  • 优化原因 由于移动设备的硬件性能有限,故减少应用程序的资源消耗显得十分重要

  • 优化方向 内存大小、安装包大小、耗电量 & 网络流量

6.1 内存优化

  • 优化原因
    避免因不正确使用内存 & 缺乏管理,从而出现 内存泄露(ML)、内存溢出(OOM)、内存空间占用过大 等问题,最终导致应用程序崩溃(Crash

  • 优化方向 常见的内存问题如下

    1. 内存泄露
    2. 内存抖动
    3. 图片Bitmap相关
    4. 代码质量 & 数量
    5. 日常不正确使用
  • 具体优化方案 下面,我将详细分析每项的内存问题 & 给出优化方案。具体请看文章:

  1. Android性能优化:这是一份全面&详细的内存优化指南
  2. Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

6.2 减少安装包大小

  • 优化原因
    应用程序的安装包大小虽对应用程序的使用无影响,但影响的是:
  1. 空间占有率:即 应用程序占有手机内存的大小
  2. 下载门槛:应用的安装包越大,用户下载的门槛越高

特别在移动网络下,用户下载应用时,对安装包大小的要求更高,因此减小安装包大小可让更多用户愿意下载 & 使用产品

  • 安装包结构 介绍

示意图

  • 优化方案

示意图

6.3 减少网络流量

  • 优化原因 每次获取资源时 都通过流量 & 网络加载的方式,将耗费大量网络流量

  • 优化方案
    主要通过 缓存 减少网络流量,采用三级缓存方案:即 内存缓存 - 硬盘缓存- 数据库- 文件 - 网络缓存

具体描述:当加载资源时,先从内存缓存中寻找;若内存缓存中没有,则从文件缓存中寻找;若文件缓存中没有,最终再通过流量从网络中加载获取

  • 具体应用
    Android:手把手教你构建 WebView 的缓存机制 & 资源预加载方案

6.4 减少应用的耗电量

  • 优化原因
    随着智能手机普及 & 应用程序App的功能发展,人们的日常生活都离不开智能手机 & 各式各样的应用程序App,故 应用程序的耗电量指标则显得十分重要

具体优化方案如下:

示意图

6.5 总结

下面,总结 关于资源节省性的性能优化方案

示意图


7. 总结

  • 区别于 功能性开发需求的短期性,性能优化是贯穿整个应用程序App项目的持续性需求;虽项目一开始时,性能优化的优先级较低,但当应用程序App的用户体量达到一定规模时,性能优化 则非常重要
  • 本文全面总结了Android开发中的性能优化 所有知识,含:优化方向、原因 & 具体优化方案,下面用2张图总结:

  性能优化概述   示意图

Android性能优化:如何让App更快、更稳、更省(含内存、布局优化等)相关推荐

  1. 更快地编写更好的代码:5 分钟阅读

    更快地编写更好的代码:5 分钟阅读 关于如何在不影响质量的情况下更快地编码的小技巧 最近,我阅读了David Farley的"现代软件工程",它详细阐述了现代软件开发核心的持久性原 ...

  2. 超越Swin Transformer!谷歌提出了收敛更快、鲁棒性更强、性能更强的NesT

    [导读]谷歌&罗格斯大学的研究员对ViT领域的分层结构设计进行了反思与探索,提出了一种简单的结构NesT,方法凭借68M参数取得了超越Swin Transformer的性能. 文章链接:htt ...

  3. UP-DETR:收敛更快!精度更高!华南理工微信开源无监督预训练目标检测模型...

    关注公众号,发现CV技术之美 0 写在前面 基于Transformer编码器-解码器结构的DETR达到了与Faster R-CNN类似的性能.受预训练Transformer在自然语言处理方面取得巨大成 ...

  4. 更快,可扩展性更强的 Apache Cassandra 4.0 正式发布

    责编 | 张红月 出品 | CSDN(ID:CSDNnews) 上周刚刚宣布因 Bug 延迟发布的 Apache Cassandra 4.0 版本正式发布了.Apache Cassandra 副总裁 ...

  5. 哪个更快:Java 堆还是本地内存

    使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...

  6. java 本地内存_哪个更快:Java堆还是本地内存

    使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...

  7. Android性能调优:App启动速度优化

    一.App启动分类 1.冷启动 Cold start 在启动应用前,系统还没有App的任何进程.比如设备开机后应用的第一次启动,系统杀掉应用进程 (如:系统内存吃紧引发的 kill 和 用户主动产生的 ...

  8. EfficientNetV2:训练速度快了5~10x,更小,更快,精度更高的EfficientNet

    本文转自AI公园. 作者:Mostafa Ibrahim 编译:ronghuaiyang 导读 相比于之前的SOTA,训练速度快了5~10x,而且性能更高. 论文链接:https://arxiv.or ...

  9. 德鲁伊 oltp oltp_内存中OLTP –更快变得更简单!

    德鲁伊 oltp oltp In-memory OLTP is a revolutionary tool introduced on SQL Server 2014. On SQL Server 20 ...

  10. Wi-Fi 6强势来袭-更大容量 更低延迟 更快网速 更安全

    - 季冠闪星云 - Wi-Fi 6时代 -大容量 • 低延迟- 近几年,5G和Wi-Fi 技术都是热门话题,随着科技互联网的飞速发展,Wi-Fi 技术也随之得到了大规模提升.各行各业都在进行企业数字化 ...

最新文章

  1. 【迁移学习(Transfer L)全面指南】Pytorch处理体积数据
  2. js 正则学习小记之匹配字符串
  3. MVVM架构~knockoutjs实现简单的购物车
  4. linux安装后启动mysql,linux安装完mysql后启动错误
  5. 根据坐标如何在matlab中l连成曲线,matlab中,如何将两条曲线画在一个坐标系里,plot(x1,x2,y1,y2)还是怎样...
  6. java 多线程操作map_Java 多线程中ConcurrentHashMap并发读写操作范例
  7. java钟使用dwr_DWR中各种java方法的调用
  8. 1.1.15 word调整文字与下划线之间的间距
  9. 硬件仿真加速器(emulator)
  10. 智能家居控制系统制作技术_【动态】HDL在欧洲推广智能家居技术
  11. 员工辞职的真正原因:更想远离这样的领导,而不是这家公司
  12. 仿剩余金额宝数字渐慢跳动效果
  13. 2014级学生程序设计学习大数据
  14. JS基礎:Hoisting 變量提升、TDZ 暫時性死區(Temporal Dead Zone)
  15. NSWindow纯代码设置
  16. Java 根据当前日期,获取到月初,和月底时间
  17. 计算机文档打不开是什么原因,文档打不开电脑我的文档Word突然打不开了,是怎会是啊?其他还都 爱问知识人...
  18. AndroidTV 盒子查看启动apk的包名和类名
  19. 学校Win7 KMS激活服务器已经可以用了
  20. 计算机图像处理怎么学,计算机图像处理在全息学中的应用

热门文章

  1. 数学系列:数学在计算机图形学中的应用
  2. Win10下SQL2000 企业管理器 新建表/修改表 崩溃问题的应急
  3. Windows 10 on ARM, version 21H2 (released Nov 2021) ARM64 简体中文版、英文版(企业版)下载
  4. IPC 通信 - IPC
  5. Windows的功能键介绍(很全)
  6. 机器人之Cartographer
  7. Wordpress限制游客访问权限(免插件) 实现禁止游客访问功能
  8. c#自学二之KTV点歌系统
  9. mac mysql docker_Mac上使用Docker如何快速启动MySQL测试
  10. 关于Navicat和DBeaver的个人使用中问题