Android性能优化概述

  1. 应用启动速度慢
  2. 页面加载慢
  3. 交互卡顿
  4. Crash
  5. ANR

针对这些问题,可以逐一进行优化

1.启动优化

Android应用启动分为冷启动和热启动以及初次安装启动,此处只分析冷启动及热启动
冷启动:当设备无该应用进程时,用户操作拉起应用,Android系统会先给应用创建进程,然后创建Application(每个应用进程有且仅有一个Application),并在完成Application相关任务之后才会拉起对应Activity,然后渲染Activity界面,完成冷启动

热启动:即冷启动后,用户推出应用所有页面(Activity)回到设备桌面,此时正常情况下系统不会立马杀掉进程及Application,还会保留一段时间,此时再拉起应用,系统直接初始化对应Activity页面,不会再创建Application,这就是热启动。所以,热启动一定比冷启动速度更快

了解了Android应用的启动机制,就可以针对性优化。
首先需要明确一个启动优化的和核心思想:启动过程中尽量少做事。根据这个思维逻辑进行优化。
冷启动,创建进程,这是系统的事,我们干预不了,那就要在Application中做文章。
随着应用的业务日益复杂,使用到的模块日益增多,就可能会有越来越多的模块在Application中完成,这些模块任务也是导致应用启动速度慢的原因之一,为此,我们总结了几条优化经验:

  • 必要且耗时的,考虑放到子线程中处理
  • 非必要且耗时的,考虑使用异步加载或按需加载,即使用到了再去执行对应模块任务

接下来是Activity的启动加载,这是冷启动、热启动都需要处理的事情。根据activity的生命周期,我们知道,activity要执行到onResume方法页面才算启动完成并显示,所以需要对其前面的生命周期方法减少耗时,根据这个逻辑,我们就到了第二条需要优化的方面,即页面加载慢问题优化

2.页面加载慢优化

根据前面叙述,我总结了几条优化经验,欢迎补充

  • 使用懒加载:针对主页UI比较复杂的应用,考虑使用懒加载的方式,比如,典型的页面由Tab+Viewpager+Fragmeng组成,启动时只加载当前可见的Fragment数据,其他Fragment使用懒加载方式加载
  • 减少页面布局层级:合理使用RelativeLayout和LinearLayout等容器布局,比如:LinearLayout加载效率要高于RelativeLayout,那在布局层级相同的情况下,就使用LinearLayout,但有时使用LinearLayout时可能会比使用RelativeLayout多几个层级,综合考虑之下,就需要使用RelativeLayout比较合适,此外,针对自定义控件,我们还可以考虑使用merge标签减少布局层级。
  • 提高显示速度:使用ViewStub标签,按需加载,仅加载我们需要显示的UI。ViewStub是一个轻量级的View,它是一个看不见的,并且不占布局位置,只有ViewStub会被初始化,然后当ViewStub被设置为可见时,或是调用了ViewStub.inflate()时,ViewStub所指向的布局才会被加载和实例化,然后ViewStub的布局属性都会传给它指向的布局。
  • 避免过度绘制:移除xml中非必要的背景,移除Window的默认背景以及按需展示背景图片
3.交互卡顿

应用启动后用户肯定是需要交互的,交互的过程中如果出现页面卡顿,比如:页面滑动不流畅、点击事件响应迟钝等问题,就有必要对此进行优化,对此,我也总结了几条优化经验

  • 合理的刷新机制:减少UI的刷新次数,比如,刷新进度条,在符合产品要求的基础上,只有在进度变化>=1时进行进度刷新,否则拦截刷新操作;然后,避免后台线程影响前台操作,比如在一个带有图片的列表中,用户正在滑动列表,滑动过程中可以考虑暂停列表中图片的下载和加载,等滑动停止后再恢复;最后是减少刷新区域,比如删除操作一个Item,UI刷新控制在当前Item区域

  • 提升动画性能:优先考虑使用属性动画完成需求,属性动画相比补间动画有更好的性能,然后尽量少用帧动画,帧动画非常吃内存,特别是图片多而且大的时候

  • 其他基本的,不要在主线程执行耗时任务,数据一次性不要加载过多,使用懒加载方式,分页加载

4.Crash

安卓应用程序crash主要有两大因素
1.内存溢出(OOM)导致crash。需要知道,Android应用也是一个Java程序,所以也是运行在Java虚拟机里的。而虚拟机分配给我们应用的内存也是有限的,所以,当应用使用的内存占用超过了虚拟机分配使用的内存,就会造成内存溢出,进而导致程序异常(Crash)。所以作为开发者就有必要关注程序运行过程中内存的使用。另外,内存的高占用还会导致频繁的GC操作,导致内存抖动,GC期间还会影响到工作线程使其停顿,也就间接导致了应用的卡顿,此时就涉及内存的优化。内存的优化涉及好多方面,包括如内存泄漏处理、图片内存优化等

2.程序设计逻辑缺陷导致crash,这个没什么说的,暴露一个修改一个,开发者开发时多注意按开发质量要求进行。

5.ANR

ANR,即应用无响应,这也是我们开发中容忍度比较低的一个问题,总的 来说,引起ANR的根本原因有以下两种:
1.应用程序自身有逻辑缺陷,或者在某些异常场景触发了此缺陷,导致的ANR,比如主线程执行了耗时任务、主线程阻塞、死循环、死锁等,针对这些问题导致的ANR,一般可以通过trace日志查看堆栈就可以定位出问题代码,一样地,这种问题发现一个改一个。另外,有一个常见的因系统层的问题导致的ANR,我们是不好处理的,就是Binder响应不及时,这种问题据我所知应用层没有比较好的解决方法(若某位大佬清楚,望告知)

2.由于Android设备其他进程导致的CPU占用高,导致当前应用进程无法抢到CPU时间片,导致了ANR,这类ANR与设备硬件属性有关,应用层没有太多的操作空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/499016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Druid连接Oracle数据库,连接失效导致SQL无法执行

原始配置: type: com.alibaba.druid.pool.DruidDataSource druid:initial-size: 5max-active: 25min-idle: 5max-wait: 10000testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsetimeBetweenEvictionRunsMillis: 2000minEvictableIdleTimeMillis: 600000ma…

JVM调优(内存、GC、JVM参数)

内存调优 常用监控工具 Top命令 top命令是linux下用来查看系统信息的一个命令,它提供给我们去实时地去查看系统的资源,比如执行时的进程、线程和系统参数等信息。进程使用的内存为RES(常驻内存)- SHR(共享内存&…

Cursor登录按钮点击没反应

问题 系统:Windows11 Cursor:Cursor 0.44.9 当安装Cursor打开进行登录时,点击Sign in没反应 解决方案 1.打开window11的设置 2.点击应用中的默认应用 3.在设置应用程序的默认值中搜索Google(没有Google浏览器的尝试下载一个&a…

强化学习(1)

Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标:最大化总…

异步请求在TypeScript网络爬虫中的应用

异步请求的重要性 异步请求是现代网络应用中不可或缺的一部分,特别是在网络爬虫领域。它允许爬虫在等待网络响应的同时继续执行其他任务,从而提高效率和性能。在JavaScript和TypeScript中,异步请求可以通过多种方式实现,包括回调…

OpenLinkSaas使用手册-项目外部资源管理

在软件项目开发过程中,会依赖很多外部系统,比如服务器,代码仓库,CI/CD,构件仓库等等。 OpenLinkSaas可以在右侧工具栏中的服务列表中,添加这些外部资源。 进入外部服务列表 代码仓库 一个软件项目可能会…

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册:Docker一键部署Immich,照片视频备份利器 前言 随着人们手机、PC、平板等电子产品多样,我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重要的问题。 传统的云备份虽然方便&…

ArcGIS教程(009):ArcGIS制作校园3D展示图

文章目录 数据下载校园3D展示图制作创建要素类矢量化【楼】要素矢量化【绿地】矢量化【范围】矢量化处理打开ArcScene添加动画数据下载 https://download.csdn.net/download/WwLK123/90189025校园3D展示图制作 创建要素类 添加底图: 新建【文件地理数据库】,并修改名称为【…

Windows安装了pnpm后无法在Vscode中使用

Windows安装了pnpm后无法在Vscode中使用 解决方法: 以管理员身份打开 PowerShell 并执行以下命令后输入Y回车即可。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser之后就可以正常使用了

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。 编译源码…

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法,用于从信号中去除噪声。这种方法基于小波变换,它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤: (1)小波变换:首先对含噪信…

关于埃斯顿机器人指令含义

等待一组数字量输入指令,用于多个输入数字量的指示! DO8421(9.17.0)该指令含义为将9-17端口的虚信号输出为0 (图1) (CALL指令) 子程序调用指令,用于程序中调用子程序 (SetSimDO指令) 设置虚拟数字量输出指令,用于程序中设置虚…

Mac 环境 VVenC 编译与编码命令行工具使用教程

VVenC VVenC 是一个开源的高效视频编码器,专门用于支持 H.266/VVC (Versatile Video Coding) 标准的编码。H.266/VVC 是继 HEVC (H.265) 之后的新一代视频编码标准,主要目的是提供比 HEVC 更高的压缩效率,同时保持或提高视频质量。H.266/VVC…

html+css+js网页设计 美食 家美食1个页面

htmlcssjs网页设计 美食 家美食1个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#xf…

【发票提取明细+发票号改名】批量提取PDF电子发票明细导出Excel表格并改名技术难点,批量PDF多区域内容识别提取明细并用内容改名的小结

1、图片版的发票提取表格改名 【批量图片发票识别表格】批量图片发票的提取Excel表格和提取字段改名,扫描发票识别表格,拍照发票识别表格,图片发票识别改名我们在工作中很多扫描发票,拍照发票,需要整理成excel表格&am…

如何规范的提交Git?

多人协作开发提交代码通常是遵循约定式提交规范,如果严格安照约定式提交规范, 手动进行代码提交的话,那么是一件非常痛苦的事情,但是 Git 提交规范的处理又势在必行,那么怎么办呢? 经过了很多人的冥思苦想…

MiFlash 线刷工具下载合集

MiFlash 线刷工具下载合集 MiFlash 线刷工具下载合集 – MIUI历史版本相较于小米助手的刷机功能,线刷还是偏好使用 MiFlash。特点是界面简单纯粹,有自定义高级选项,可以选择刷机不上 BL 锁,自定义刷机脚本,EDL 刷机模…

STM32 SPI读取SD卡

七个响应类型: R1 Response (Normal Response): R1响应是最基本的响应,包含一个字节的状态位,用于指示命令是否成功执行。常用。最高位为0。最低位为1表示是空闲状态。其他位是各种错误提示。 R1b Response (Normal with Busy): 类似于R1&a…

深入浅出 Spring (二)| 依赖注入(DI)、自动装配

3. 依赖注入(DI) 3.1 概念 依赖注入(Dependency Injection,DI)。 依赖:bean对象的创建依赖于容器!注入:bean对象中的所有属性,由容器来注入! 创建子项目 spring04-DI…

线性代数期末复习 [基础篇]

关于第六点: AXB 在期末考试中一般A都是可逆的 我们可以先把A的逆求出来,X A − 1 B A^-1B A−1B,或者 (A,B) -> r (E, A − 1 B A^-1B A−1B) 如果A矩阵不可逆,转变为方程组求解问题,假设都是二维矩阵 A(x1,x2) (b1,b2) Ax1 b1,Ax2 b2 XAB 如果A可逆,直接XB A − 1 A^-…