当前位置: 首页 > news >正文

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与设备硬件属性有关,应用层没有太多的操作空间

相关文章:

Android性能优化概述

应用启动速度慢页面加载慢交互卡顿CrashANR 针对这些问题,可以逐一进行优化 1.启动优化 Android应用启动分为冷启动和热启动以及初次安装启动,此处只分析冷启动及热启动 冷启动:当设备无该应用进程时,用户操作拉起应用&#xff…...

C++ 实现map容器从大到小排序

map容器默认从小到大排序 利用仿函数可以修改map容器的排序规则为从大到小 示例&#xff1a; #include<iostream> #include<string> #include<map> using namespace std; class MyCompare { public: bool operator()(const int v1, const int v2) co…...

java中的文件操作

基础知识 1.File类对象的常用方法 一、 创建文件和目录 1.createNewFile() 用于创建一个新的文件&#xff0c;如果文件已经存在&#xff0c;则返回 false File file new File("C:\\Users\\P51\\Desktop\\file.txt"); file.createNewFile(); 2.mkdir() 用于创建一个…...

修复OpenHarmony系统相机应用横屏拍照按钮点不到的问题

适配OpenHarmony系统相机应用横屏UI&#xff0c; 相关pr: https://gitee.com/openharmony/applications_camera/pulls/233/files 适配效果 如何安装 编译好的hap提供在附件中 1.预置在源码&#xff0c;随固件安装 2.安装hap hdc shell "mount -o remount,rw /"…...

2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情

2024165读书笔记|《飞花令合》—— 人生飘忽百年内&#xff0c;且须酣畅万古情 屈原班婕妤曹植刘绘卢思道卢照邻苏味道刘希夷李白高适杜甫司空曙白居易温庭筠韦庄窦叔向张泌林逋柳永晏殊欧阳修李觏舒亶秦观陈瓘李清照陆游辛弃疾姜夔蒋捷吴伟业纳兰性德张惠言邓廷桢 《飞花令合》…...

哈夫曼编码(Huffman Coding)与哈夫曼树(Huffman Tree)

已知字符集{a,b,c,d,e,f}&#xff0c;若各字符出现的次数分别为6&#xff0c;3&#xff0c;8&#xff0c;2&#xff0c;10&#xff0c;4&#xff0c;则对应字符集中各字符的哈夫曼编码可能是&#xff08; &#xff09;。 A.00&#xff0c;1011&#xff0c;01&#xff0…...

Django项目中高效管理和使用选择常量

引言 在开发Django项目时,我们经常需要处理各种选择字段,比如用户类型、订单状态或产品分类等。如何有效地管理这些选择常量,使其在整个项目中保持一致性,同时又易于维护和更新呢?本文将介绍一种在Django项目中集中管理和使用选择常量的方法。 正文 © ivwdcwso (I…...

拦截器(Interceptor)的使用

在Java Web开发中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是一种动态拦截请求和响应的对象&#xff0c;它可以在请求被控制器处理之前和之后执行一些预处理和后处理逻辑。要定义一个拦截器并使其生效&#xff0c;通常需要以下几个步骤&#xff1a; 1. 定义拦截…...

线段树例题题解

卫星覆盖&#xff08;NOI1997&#xff09; 题面&#xff1a; SERCOI&#xff08;Space-Earth Resource Cover-Observe lnstitute&#xff09; 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...

AI提示词工程的“优化背后”:如何通过精准提示提升模型性能?

提示词工程(Prompt Engineering)已经成为推动AI模型如GPT等发挥其强大能力的核心。AI模型的输出质量与输入的提示词密切相关。因为之前已经大致用过一段时间提示词,所以这篇文章集中在有一定基础,起码对提示词不陌生,想要去设计和优化提示词+处理复杂问题的时候不知道如何…...

c# Record关键字

在 C# 9.0 中引入了 record 关键字&#xff0c;用于定义记录类型&#xff08;Record Types&#xff09;。记录类型是一种轻量级的数据载体&#xff0c;专注于表示数据&#xff0c;它提供了内置的相等性比较、生成属性和方法等功能&#xff0c;使得编写数据类更加简洁和高效。 …...

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程

前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI&#xff0c;用户可以轻松管理 Nginx 配置&#xff0c;而无需直接编辑配置文件&#xff0c;尤其适合新手用户和频繁修改配置的场景。 官网文档&#xff1a;nginxWebUI - 文档 本文将分享为什么选择 ngin…...

家政预约小程序04活动管理表结构设计

目录 1 创建活动表2 创建活动规则表3 创建活动参与记录表总结 为了满足我们日常的营销&#xff0c;我们通常需要搞一些活动&#xff0c;比如满减、折扣、团购等。启动活动后&#xff0c;会在首页进行显示&#xff0c;当用户访问小程序的时候&#xff0c;就可以参与活动&#xf…...

谷歌浏览器的在线存储功能使用方法

谷歌浏览器不仅是目前全球使用最广泛的网络浏览器之一&#xff0c;它还集成了许多实用的功能来提升用户体验。其中&#xff0c;谷歌浏览器的在线存储功能允许用户将数据保存在云端&#xff0c;实现跨设备的无缝同步和共享。本文将详细介绍如何在谷歌浏览器中使用这一功能。 一、…...

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发

背景介绍 在当今数字化时代&#xff0c;各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控&#xff0c;还是智慧工厂、智慧城市等领域&#xff0c;都需要高效、智能的设备来保障安全和提高生产效率。然而&#xff0c;传统的视频监控设备存在诸多痛点&#xff1a;…...

回调机制实现观察者模式

观察者设计模式&#xff0c;允许对象在状态变化时通知其他依赖对象&#xff0c;通常通过回调函数实现。 在回调机制中&#xff0c;可以注册多个回调函数&#xff0c;以便在特定事件发生时依次调用它们。下面是一个示例&#xff0c;展示如何在 C 中实现一个简单的事件管理器&am…...

并发编程系列(一) -多线程技术快速入门

最近对 Java 并发编程技术知识进行了重新整理&#xff0c;再次献上文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 并发编程系列(一) -多线程技术快速入门并发编程系列(二) -Thread类介绍并发编程系列(三) -synchronized关键字介绍并发编程系列(四) -v…...

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程-CSDN博客里面有提过相关知识------IO流&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…...

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源&#xff0c;我们对共享资源进行保护&#xff0c;就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题&#xff0c;下面是一个抢票的代码&#xff0c;共计票数10000张&#xff0c;4个线程去抢 之前我们展示过封…...

[江科大STM32] 第五集快速建立STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 一个MD&#xff0c;还有所有.c.h 这里所有文件 这里所有文件...

流水线并行举例说明;GPU 的细粒度问题

GPU 的细粒度与模型并行和流水线并行关系 使用模型并行和流水线并行之后会涉及到一个模型切分细粒度的问题,先切分多头(并行执行),每一个多头在切分不同阶段(串行执行)。这种情况下GPU的细粒度是多少 在这种模型并行和流水线并行结合且按多头和阶段切分的情况下,GPU 的…...

如何确保Kafka集群的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【如何确保Kafka集群的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何确保Kafka集群的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性&#xff0c;需要…...

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Oracle SqlPlus常用命令简介

参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...

8.若依系统监控与定时任务

帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求&#xff1a;每间隔5s&#xff0c;控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景&#xff1a;比如一个任务每个…...

《计算机组成及汇编语言原理》阅读笔记:p160-p176

《计算机组成及汇编语言原理》学习第 12 天&#xff0c;p160-p176 总结&#xff0c;总计 17 页。 一、技术总结 1.PowerPC (1)programming model(mode) As in most modern computers, there are at least two separate views of the system (formally called programming m…...

TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信

上篇文章我们学习了TCP的服务器端模式的编写&#xff0c;这篇文章我们将开始编写客户端的代码&#xff0c;完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同&#xff0c;在客户端我们只需要服务器端的套接字和服务器端的地址和端口&#xff0c;用于向…...

如何在谷歌浏览器中使用自定义模板

作为最常用的网络浏览器之一&#xff0c;谷歌浏览器不仅提供了强大的功能&#xff0c;还允许用户通过各种方式自定义其外观和功能。其中&#xff0c;使用自定义模板可以极大地提升用户体验&#xff0c;无论是更改浏览器的外观还是优化网页显示效果。本文将详细介绍如何在谷歌浏…...

Day2 微服务 网关路由转发、网关登录校验、配置管理

目录 1.网关路由转发 1.1 网关 1.2 快速入门 1.2.1 创建项目 1.2.2 引入依赖 1.2.3 启动类 1.2.4 配置路由 1.2.5 测试 1.3 路由过滤 2.网关登录校验 2.1 鉴权思路分析 2.2 网关过滤器 2.3 自定义过滤器 2.3.1 自定义GatewayFilter 2.3.2 自定义GlobalFilter 2.4 登录校验 2.4.…...