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

启动优化目的

用户体验:

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

竞争优势:

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

资源管理:

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

启动优化的范围

在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.mzph.cn/news/17832.shtml

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

相关文章

132个心理性格趣味测试ACCESS\EXCEL数据库

今天又遇到了一个心理测试的数据库,这个数据库在表结构的设置上很直观,属于那种好的数据库结构,共分三个表,一个是测试项目描述表、一个是测试题选项得分表、一个是根据得分区间解析表,表与表之间通过“question_id”字…

【Python】pyqt6入门到入土系列,非常详细...

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、什么是PyQt6? 简单介绍一下PyQt6 1、基础简介 PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。 PyQt6的官网:www.riverbankcomputing.co.uk/news。 PyQt6是由Riverbank Co…

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…

力扣SQL之路:窗口函数应用

文章目录 1.引言2.力扣SQL题目3. 解题策略4.代码实现5.总结 1.引言 窗口函数是 SQL 中一种强大的分析函数,它可以在结果集中创建一个窗口,并对窗口内的数据进行计算和分析。在力扣(LeetCode)的 SQL 题目中,窗口函数经…

Linux进程概念(一)

文章目录 Linux进程概念查看进程杀死进程进程标识符 手动创建进程的方式fork函数创建进程 进程状态运行态阻塞态和挂起 Linux进程概念 前文我们了解了,进程的基本概念,在课本上被描述为,正在执行的程序,在linux内核上&#xff0c…

如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1

作者:双飞(花名:小鱼) 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好,我是 StoneDB 的实习生小鱼,目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久&#xff0c…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快,企业使用前沿技术加快商业创新,以提高竞争力。其中如何加快开发效率,为客户创造更多价值成为新的关注焦点。 继DevOps后,“平台工程”(Platform Engineering) 一词引发热议。平台工…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

信息技术会考操作题excel,信息技术会考操作题目

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;信息技术会考操作题python计算题&#xff0c;信息技术会考操作题没有保存&#xff0c;今天让我们一起来看看吧&#xff01; 1. 数据分析题&#xff08;17分&#xff09;&#xff1a; 流行病学通常关注单日治愈患者例数增…

网络知识介绍

一、TCP 传输控制协议&#xff0c;Transmission Control Protocol。 面向广域网的通信协议&#xff0c;跨域多个网络通信时&#xff0c;为两个通信端点之间提供一条具有如下特点的通信方式&#xff1a; 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…

初识Linux

今天简单了解了关于操作系统的发展史&#xff0c;学习了在Linux中如何远程连接云服务器的指令&#xff0c;以及在Linux中创建多个用户的指令。 1. ssh root 服务器远程地址 作用是用来连接XShell与云服务器&#xff0c;输入该指令后会自动生成输入密码的窗口&#xff0c;如…

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白&#xff0c;还是工作了几年的“老油条”&#xff0c;需求一直是产品经理工作的重点。只不过&#xff0c;不同年限的产品经理需要面对的需求大有不同&#xff0c;对能力的要求更高。 不知你是否遇过以下问题&#xff1f; 你接手一个项目后&#xff0c;不知从何…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶…

树莓派通过天线+gps获取经纬度并调用高德地图api在地图上标点

完整项目为《基于机器视觉的行人和路面缺陷检测及其边缘设备部署》 完整功能视频演示地址&#xff1a;本科最后的课设&#xff1a;“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_bilibili 该博客介绍的功能为&#xff1a; 1&#xff1…

初步了解c#编程语言--(1)

初识c#编程语言 一、见识c#语言编写的各类应用程序 关于用c#语言编写的各类应用程序有以下几种&#xff1a; 1.Console 在编写Console程序时&#xff0c;要注意创建项目时&#xff0c;是选择控制台应用程序&#xff08;Console Application&#xff09;&#xff0c;在这里…

正泰电力携手图扑:VR 变电站事故追忆反演

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

25.10 matlab里面的10中优化方法介绍—— 函数fmincon(matlab程序)

1.简述 关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中&#xff0c;为了便于我们理解&#xff0c;引导我们进入规划模型的一种情况。相比之下&#xff0c;非线性规划会更加贴近…

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…