Android性能优化概述
- 应用启动速度慢
- 页面加载慢
- 交互卡顿
- Crash
- 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应用启动分为冷启动和热启动以及初次安装启动,此处只分析冷启动及热启动 冷启动:当设备无该应用进程时,用户操作拉起应用ÿ…...
C++ 实现map容器从大到小排序
map容器默认从小到大排序 利用仿函数可以修改map容器的排序规则为从大到小 示例: #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() 用于创建一个新的文件,如果文件已经存在,则返回 false File file new File("C:\\Users\\P51\\Desktop\\file.txt"); file.createNewFile(); 2.mkdir() 用于创建一个…...

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

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

哈夫曼编码(Huffman Coding)与哈夫曼树(Huffman Tree)
已知字符集{a,b,c,d,e,f},若各字符出现的次数分别为6,3,8,2,10,4,则对应字符集中各字符的哈夫曼编码可能是( )。 A.00,1011,01࿰…...
Django项目中高效管理和使用选择常量
引言 在开发Django项目时,我们经常需要处理各种选择字段,比如用户类型、订单状态或产品分类等。如何有效地管理这些选择常量,使其在整个项目中保持一致性,同时又易于维护和更新呢?本文将介绍一种在Django项目中集中管理和使用选择常量的方法。 正文 © ivwdcwso (I…...
拦截器(Interceptor)的使用
在Java Web开发中,拦截器(Interceptor)是一种动态拦截请求和响应的对象,它可以在请求被控制器处理之前和之后执行一些预处理和后处理逻辑。要定义一个拦截器并使其生效,通常需要以下几个步骤: 1. 定义拦截…...
线段树例题题解
卫星覆盖(NOI1997) 题面: SERCOI(Space-Earth Resource Cover-Observe lnstitute) 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...
AI提示词工程的“优化背后”:如何通过精准提示提升模型性能?
提示词工程(Prompt Engineering)已经成为推动AI模型如GPT等发挥其强大能力的核心。AI模型的输出质量与输入的提示词密切相关。因为之前已经大致用过一段时间提示词,所以这篇文章集中在有一定基础,起码对提示词不陌生,想要去设计和优化提示词+处理复杂问题的时候不知道如何…...
c# Record关键字
在 C# 9.0 中引入了 record 关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。 …...

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程
前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI,用户可以轻松管理 Nginx 配置,而无需直接编辑配置文件,尤其适合新手用户和频繁修改配置的场景。 官网文档:nginxWebUI - 文档 本文将分享为什么选择 ngin…...

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

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

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发
背景介绍 在当今数字化时代,各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控,还是智慧工厂、智慧城市等领域,都需要高效、智能的设备来保障安全和提高生产效率。然而,传统的视频监控设备存在诸多痛点:…...
回调机制实现观察者模式
观察者设计模式,允许对象在状态变化时通知其他依赖对象,通常通过回调函数实现。 在回调机制中,可以注册多个回调函数,以便在特定事件发生时依次调用它们。下面是一个示例,展示如何在 C 中实现一个简单的事件管理器&am…...

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

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

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

【Linux-多线程】线程互斥(锁和它的接口等)
一、线程互斥 我们把多个线程能够看到的资源叫做共享资源,我们对共享资源进行保护,就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题,下面是一个抢票的代码,共计票数10000张,4个线程去抢 之前我们展示过封…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...