【Android】APP启动优化学习笔记

news2025/1/11 20:41:41

启动优化目的

用户体验:

应用的启动速度直接影响用户体验。用户希望应用能够快速启动并迅速响应他们的操作。如果应用启动较慢,用户可能会感到不满,并且有可能选择卸载或切换到竞争对手的应用。通过启动优化,可以提高应用的启动速度,让用户获得更好的使用体验。

竞争优势:

移动应用市场竞争激烈,用户有大量的选择。如果应用启动较慢,可能会失去用户,尤其是在与同类应用相比时。通过启动优化,可以提高应用的响应速度,吸引更多用户留在应用中,并提升与竞争对手的差异化竞争力。

资源管理:

应用启动时可能需要加载和初始化许多资源,如界面布局、数据等。如果启动过程冗长且资源占用过多,可能会增加系统负担,影响其他应用的运行性能,甚至导致系统崩溃。通过启动优化,可以更有效地管理和利用资源,减少对系统资源的占用,提高系统的整体性能和稳定性。

启动优化的范围

在Android应用的启动过程中,有三个主要的屏幕,分别是第一屏、第二屏和第三屏。第一屏是指应用程序加载的过程,通常会显示一个主题中设置的背景图片。第二屏是指Splash页面,显示了启动界面的内容。第三屏是指MainActivity,显示了应用的主要交互界面。

为了提高用户体验,我们通常关注应用启动到可交互页面的时间,也就是第一屏和第二屏的耗时。在这之前,还有Application的创建过程和SplashActivity的启动创建过程。所以,在启动的优化范围内,通常会从Application.attachBaseContext()开始,直到Main.onWindowFocusChanged()结束。

优化的目标是减少启动耗时,让应用尽快显示可交互页面。因此,需要关注第一屏的耗时,即Application的启动耗时,以及第一屏和第二屏的总耗时,即Application启动到可交互页面的启动耗时。

Application的创建过程的调用顺序:
在这里插入图片描述
Activity的创建到显示过程调用顺序
在这里插入图片描述

优化思路

1.工具使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就可以使用Android Studio带的性能检测工具进行检测了。

2.优化方法

1.懒加载,包括业务与布局的懒加载
2.抛到子线程让其自己加载
3.提前加载,通过多线程提高效率
4.检查主线程的IO操作
5.控制线程的数量和GC的次数

Application.onCreate()

SDK优化:

懒加载:

将SDK的初始化延迟到真正需要使用的时候再进行初始化,而不是在Application的初始化过程中全部加载。这样可以减少启动时的初始化时间,提高启动速度。

SDK之间依赖关系的优化:

某些SDK可能需要在其他SDK完成加载后才能进行初始化。可以利用拓扑算法来优化SDK的加载顺序,确保依赖的SDK先于依赖它的SDK进行加载和初始化。这样可以避免因为依赖关系导致的初始化错误或者耗时。

子线程初始化SDK:

将SDK的初始化过程放到子线程中进行,避免阻塞主线程的时间。特别是一些必须初始化的SDK,可以通过多线程加载并使用CountDownLatch进行线程的阻塞和唤醒,确保主线程能够尽快响应用户操作。

业务代码优化

禁止滥用ContentProvider:

由于ContentProvider在Application.attachBaseContext()时会进行初始化,滥用会增加启动时间。因此,需要慎重使用ContentProvider,避免过多地使用它来处理业务逻辑。

优化主线程耗时操作:

查找并优化Application主线程中耗时的代码,以减少对启动时间的影响。可以通过异步操作或者其他优化手段,将耗时操作移到子线程中进行,从而提升应用的启动速度。

Activity.onCreate()
优化布局:

减少布局背景的重复渲染、减少层级、使用ViewStub按需加载不一定显示的布局。可以考虑在子线程中加载布局或提前加载,以减少对主线程的阻塞时间。

延迟初始化:

避免在initView()中进行耗时操作,如IO操作、播放器等。将这些操作做到按需懒加载,或者在多线程中加载,避免阻塞主线程。

懒加载Fragment:

对于主页面的ViewPager+Fragment,按需懒加载Fragment,只在滑动到对应页面时才进行加载和初始化,避免一次性加载所有Fragment,节约资源和提高响应速度。

Activity.onResume()

不要在这里面做耗时操作,不要在这里面做耗时操作,不要在这里面做耗时操作。
WMS里面的知识点:页面渲染是在onResume里面的。

在这里插入图片描述

SDK之间依赖关系的优化(接上面的SDK优化的第二点)

有向无环图(DAG)

图是由一组节点(也称为顶点)和连接这些节点的边组成的数据结构。有向图是指图中的边都有一个方向,而无向图的边没有方向。有向无环图是指有向图中不存在形成环路的路径,即从任何节点出发经过若干条边后不能回到出发点。

在 Android 的 app 启动优化中使用有向无环图的一个常见场景是依赖关系管理。在复杂的 Android 应用中,不同组件(如 Activity、Fragment、Service 等)之间可能存在依赖关系,即某个组件的启动依赖于其他组件的完成。借助有向无环图,可以清晰地表示这些依赖关系,并通过拓扑排序算法来确定启动顺序,提高应用的启动性能。

具体来说,Android 的应用启动流程可以看作一张有向图,其中节点表示不同的组件,边表示组件之间的依赖关系。例如,一个 Activity 可能需要等待其他 Activity 的初始化完成后才能启动。通过构建有效的有向无环图,可以将这些依赖关系可视化,并根据拓扑排序算法确定启动顺序,从而减少不必要的等待时间,提高应用的响应速度。

Android Startup

Android Startup提供一种在应用启动时能够更加简单、高效的方式来初始化组件。开发人员可以使用Android Startup来简化启动序列,并显式地设置初始化顺序与组件之间的依赖关系。 与此同时,Android Startup支持同步与异步等待、手动控制依赖执行时机,并通过有向无环图拓扑排序的方式来保证内部依赖组件的初始化顺序。

链接: 关于Android Startup的一篇大佬的文章

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Inobitec DICOM Viewer Pro 2.11.0 Crack

Inobitec DICOM Viewer Pro 2.11.0 专业DICOM查看器、匿名器、转换器、PACS客户端、迷你PACS服务器、患者CD/DVD刻录机(带查看器)等功能的医学影像专业必备的DICOM工作站和查看器 动态渐进版本(每季度发布)扩展功能 高级 3D 重建 以 OBJ、STL、PLY、…

uni-app:实现分页功能,单击行获取此行指定数据,更改行样式

效果&#xff1a; 分段解析代码 分页功能实现&#xff1a; 一、标签 1、搜索栏-模糊查询 <!-- 搜索框--><form action"" submit"search_wip_name"><view class"search_position"><view class"search"><…

【AGC】Publishing API调用问题汇总

【问题背景】 开发者可以通过Publishing API完成几乎所有应用的管理和发布工作&#xff0c;自己制定自动发布接口。Publishing API有很多接口&#xff0c;包括了查询应用信息、更新应用信息、上传文件、提交发布等主要接口。下面总结了一些开发者在使用Publishing API过程中容…

构建高效物理计划:从逻辑查询到算子实现

​一、前言 本文主要介绍内容一条查询语句如何实现由逻辑计划生成物理计划。查询语句要执行的操作、涉及的表信息等存放于逻辑计划的 PlanNode 中&#xff0c;物理计划的构建就是通过解析逻辑计划的 PlanNode&#xff0c;将对应的 PlanNode 转换为对应算子&#xff08;Process…

springboot整合tio-websocket方案实现简易聊天

写在最前&#xff1a; 常用的http协议是无状态的&#xff0c;且不能主动响应到客户端。最初想实现状态动态跟踪只能用轮询或者其他效率低下的方式&#xff0c;所以引入了websocket协议&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务…

富士通“Actlyzer”提供基于AI的基于视频的行为分析

想象一下这样的场景&#xff1a;一个男人走近一个家的前门&#xff0c;蹲下并检查钥匙孔。这是丢失房屋钥匙的居民还是客人&#xff1f;还是寻找入口点的窃贼&#xff1f;“Actlyzer”是一种新的人工智能安全系统&#xff0c;旨在区分这种情况。富士通实验室和研发中心的行为分…

经典文献阅读之--Online Extrinsic Calibration(激光雷达,视觉和惯导外参在线标定)

0. 简介 为了实现精确定位&#xff0c;自动驾驶车辆通常依靠围绕移动平台的多传感器感知系统。校准是一个耗时的过程&#xff0c;机械畸变会导致外部校准误差。因此&#xff0c;《Lidar-Visual-Inertial Odometry with Online Extrinsic Calibration》提出了一种激光雷达-视觉…

安卓手机怎样录屏?手机录屏小技巧分享

如果你需要在安卓手机上录制一段视频或者教程&#xff0c;录屏功能是一个非常有用的工具。在这篇文章中&#xff0c;我们将会介绍安卓手机如何录屏&#xff0c;并分享一些小技巧。 在安卓手机上录屏的方法有很多种&#xff0c;这里我们介绍两种比较常用的方法。 方法一&#x…

Nodejs 爬虫 第二章(通过掘金 userId 抓取到所有文章)!HTML to Markdown

前言 就在昨天晚上&#xff0c;做了一个通过掘金文章链接进行解析html转化为markdown文档&#xff0c;并且把图片进行下载和替换&#xff0c;但是最后也留了个伏笔&#xff08;我一定会回来的&#xff5e;&#xff09;就是通过用户id&#xff0c;把所有的文章都转化出来&#x…

安卓嵌入h5页面方法笔记

<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><uses-featureandroid:name"android.hardware.t…

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper 在这一讲之前&#xff0c;我们所用的大模型都是针对文本的。这一讲我们增加一个新的领域&#xff0c;即音频。我们将介绍OpenAI的Whisper模型&#xff0c;它是一个处理音频的大模型。 Whisper模型的用法 Wh…

万界星空/推出生产制造执行MES系统/开源MES/免费下载

免费MES系统介绍 什么是MES系统呢&#xff1f;MES系统主要功能就是解决“如何生产”的问题。通过实施MES系统&#xff0c;一站式解决您所困扰的所有生产制作流程问题。 普通的免费MES系统只提供简单的基本功能让客户体验&#xff0c;而万界星空MES系统运用低代码的形式开发&a…

Python初刷题笔记

目录 保留小数的方法&#xff1a;​编辑 进制问题如何转换&#xff1a; 大小写如何转换&#xff1a; 删除空格问题&#xff1a; 循环输入的简便方法&#xff1a; 截取某一部分所需要的函数&#xff1a; 字符串处理常用函数小汇总&#xff1a; sort和sorted函数的区别&am…

【Python】数据分析+数据挖掘——掌握Python和Pandas中的单元格替换操作

1. 前言 数据处理和清洗是数据分析和机器学习中至关重要的步骤。在数据处理过程中&#xff0c;我们经常需要对数据集进行清洗和转换&#xff0c;其中单元格替换是一个常用的技术。Python作为一种功能强大且灵活的编程语言&#xff0c;为数据处理提供了丰富的工具和库。Pandas库…

《你不知道的 Chrome 调试技巧》-- 学习笔记

截全屏 ctrl shift p &#xff1a;调出command 然后输入screen 效果 引用上次结果 在console中&#xff0c;想要引用上次的计算结果 使用$_ 添加有条件的断点 右击行号&#xff0c;选择 Add conditional breakpoint...(添加条件断点) 或者右击一个已经设置的断点并且选择…

GC垃圾回收器【学习笔记】

GC&#xff1a;Garbage Collectors 垃圾回收器 C/C&#xff0c;手动回收内存&#xff1b;难调试、门槛高。忘记回收、多次回收等问题 Java、Golang等&#xff0c;有垃圾回收器&#xff1a;自动回收&#xff0c;技术门槛降低 一、如何定位垃圾&#xff1f; https://www.infoq.c…

24考研数据结构-串的定义和基本实现

目录 第四章&#xff1a;串概论数据结构之串&#xff1a;定义、实现与存储结构1. 串的定义2. 串的实现方式2.1 顺序存储2.2 链式存储 3. 串的基本操作4. 串的应用结论 4.1串的定义和实现4.1.1串的定义4.1.2串的基本操作字符集编码 4.1.3串的存储结构1. 定长顺序存储表示基本操作…

海外ASO优化之通过应用商店优化来获得自然用户

应用商店优化需要我们跟踪关键词的数据&#xff0c;从而评估我们的ASO策略有效性。跟踪我们选择的时间段和国家/地区的重要搜索查询的历史排名和应用程序的最佳位置。根据我们关注的每个应用的关键词&#xff0c;位置&#xff0c;特色&#xff0c;评论和更新&#xff0c;立即了…

性能压力测试的重要性与实施方法

性能压力测试是在软件开发过程中评估系统在不同负载条件下的表现和稳定性的关键步骤。这种测试是为了确定系统在正常和峰值负载下的性能表现&#xff0c;以验证系统是否能够满足用户需求&#xff0c;同时发现潜在的性能问题并加以解决。 首先&#xff0c;性能压力测试对于确保系…

【HMS Core】融合搜索无法打开搜索服务连接问题

【关键字】 HMS、搜索服务、融合搜索 【问题描述】 有开发者反馈在集成搜索服务-融合搜索时&#xff0c;出现了无法打开搜索服务连接的问题。 严格按照官方文档集成&#xff0c;配置&#xff0c;权限已添加 searchServiceAbility .connect(new ServiceConnectCallback() { …