App 启动速度优化

news2024/10/5 8:20:55

前言​​​​​​​ 

APP打开的一瞬间速度快慢;就好比人的第一印象,快速的打开一个应用往往给人很舒服的体验。app经常性卡顿启动速度很慢,这无疑是对用户的流失。

启动方式介绍

APP启动的方式分为3种:冷启动、热启动、温启动。

  • 冷启动:应用程序从头开始,须要作大量的工做,耗费的时间最多。
  • 热启动:系统会把你的活动放在前台,活动有驻留在内存中,好比按了home键。相对于冷启动,开销较低。
  • 温启动:用户退出应用程序,随后又从新启动,可是活动的进程是有驻留在后台的,好比按了back键退出应用。

启动过程

目前以app为例,介绍app的点击app icon到应用完全启动的过程。

1、用户在Launcher上点击App Icon

2、系统为App创建进程,显示启动窗口,创建应用进程信息

3、App在进程中创建自己的组件

  • 初始化应用中的对象(比如 Application 中的工作);
  • 启动主线程(UI 线程);
  • 创建第一个 Activity或者Controller;
  • 加载内容视图(Inflating);
  • 计算视图在屏幕上的位置排版(Laying out);
  • 绘制视图(draw);

只有当应用完成第一次绘制,系统当前展示的空白背景才会消失,才会被Activity的内容视图替换掉。也就是这个时候,用户才能和我们的应用开始交互。这个过程可以用下面这幅图来描述:

  上述流程里面的红色框部分是由系统控制的,跟ROM相关的,我们无法处理。对于启动速度,我们能够控制的是Application的创建过程。
 

优化策略(以安卓app为例)

1 优化onCreate, onStart,onResume函数

(1) 由于许多内容在activity的UI初始化和生命周期中需要用到,所以大部分activity中的成员需要在onCreate中通过new的方式赋值。这就要求new的类的构造函数应该尽可能简单,不要有耗时操作,以便快速执行。

(2) 不要在这些函数中new暂时用不到的内容,比如一些提醒的dialog,可以在需要提醒的地方再去创建。

2 优化布局文件

(1) 减少UI的布局嵌套层数,从而减少layout时间。 简化XML布局,界面布局时,层次越多,加载的时间就越长。因此应该尽可能的减少布局层次。如果实在层次太多并且无法简化,建议不使用XML布局,直接在代码中进行布局 判断嵌套布局是否可以优化的方法: i. 借助工具Hierarchy Viewer,可以看到layout比较耗时的节点。 ii. 直接review xml布局文件。

(2) 尽量使用RelativeLayout替换LinearLayout。

(3) 尽量为所有分辨率创建资源,减少不必要的硬件缩放,这会降低UI的绘制速度。

(4) 首次不需要显示的节点,尽量设置为GONE。 

3 优化draw过程

(1) 去掉不必要的背景,比如如果子节点和父节点size一样,那么父节点的background可以不设或者设为null.

(2) 尽可能少用或者不用高质量图片,以提高运行效率。

4 优化数据访问

有些属性需要在onCreate就获取,而这些属性保存在ContentProvider中。可以从下面两方面进行优化:

(1) 少用cursor.getColumnIndex。可以在建表的时候用static变量记住某列的index,直接调用相应index而不是每次查询。

(2) 查询时返回更少的结果集及更少的字段。只返回需要的字段和结果集,更多的结果集和字段会消耗更多的时间及内存。

5 优化自定义控件或UI部件

自定义控件和UI部件,不管这些控件是否支持xml化,实现它们的代码质量很重要,要尽可能简化它们的构造过程。

6 代码方面的优化

(1) 使用缓存。尽量将需要频繁访问或访问一次消耗较大的数据存储在缓存中。

(2) 使用多线程。比较耗时的过程,尽可能的使用异步加载。避免UI主线程阻塞,发生长时间不响应。

(3) 只需要获取图片的高宽时,可以设置InJustDecodeBounds为true。这样就不会去decode图片,减少了图片解析的时间。

(4) 判断语句如果较多时,尽量使用switch..case..,而不是使用if..else..。因为if..else..是从上到下进行判断,而switch..case..有对判断条件进行优化。

(5) for()循环中有if()判断,考虑实现为将if()判断语句放在for()语句外面,减少判断次数,for语句可以快速执行。

(6) String的拼接尽量使用io流。

(7) 数据类型和数据结构的选择。比如:hash系列数据结构查询速度更优,ArrayList存储有序元素。

7 其它

通过使用Show GPU Overdraw去检测Overdraw,最终可以通过移除不必要的背景以及使用canvas.clipRect(重复绘制覆盖区域)解决大多数问题。

8 减少App启动时的耗时操作

1、减少App启动时的初始化操作:App启动时,会进行一些初始化操作,比如加载资源、数据库连接等,如果这些操作花费的时间过长,就会导致App启动速度变慢。因此,应该尽量减少App启动时的初始化操作,可以采用懒加载的方式,将一些不是必要的初始化操作放到后面,而不是在App启动时就完成。

2、减少App启动时的网络请求:App启动时,如果要发起网络请求,会增加App启动时间,因此,应该尽量减少App启动时的网络请求,如果有必要发起网络请求,可以采用异步的方式,将网络请求放到后台,而不是在App启动时就发起网络请求。

9 缩短App启动时的加载时间

1、减少App启动时的资源加载:App启动时,会加载一些资源,比如图片、音频等,如果这些资源太多,就会增加App启动时间。因此,应该尽量减少App启动时的资源加载,可以采用缓存的方式,将一些常用的资源放到本地,而不是每次都要从网络上加载。

2、减少App启动时的代码加载:App启动时,会加载一些代码,如果这些代码太多,就会增加App启动时间。因此,应该尽量减少App启动时的代码加载,可以采用模块化的方式,将一些不常用的代码放到模块中,而不是每次都要加载。

10 优化App启动时的内存占用

1、减少App启动时的内存占用:App启动时,会占用一些内存,如果这些内存太多,就会增加App启动时间。因此,应该尽量减少App启动时的内存占用,可以采用内存优化的方式,将一些不常用的内存释放掉,而不是每次都要占用。

2、减少App启动时的线程数量:App启动时,会创建一些线程,如果这些线程太多,就会增加App启动时间。因此,应该尽量减少App启动时的线程数量,可以采用多线程优化的方式,将一些不常用的线程关闭,而不是每次都要创建。

总结

总结起来,APP启动速度优化就一句话:让系统在启动期间少做一些事。当然我们得先清楚工程里做的哪些事是在启动期间做的、对启动速度的影响有多大,然后case by case地分析工程代码,通过放到子线程、延迟加载、懒加载等方式让系统在启动期间更轻松些。

另外:

可以添加一个简单闪屏页面来过渡(视觉上会“快”些),避免首次加载展示过多的数据(如果这个就可以理解为app已启动。否则可在第一次展示的首页做更少的耗时任务,是用缓存,或者异步加载、懒加载的方式来展示非必需的大量数据内容)。

参考文章:Android性能优化——(APP启动速度优化)

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

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

相关文章

28.vite

目录 1 一些概念 1.1 单页面应用程序SPA 1.2 vite 2 初始化vite项目 3 项目中的文件 1 一些概念 1.1 单页面应用程序SPA 单页面应用程序是只有一个页面的前端,切换页面通过前端路由来切换 特点如下 实现了前后端分离,后端仅出接口&#…

Flink TableAPI window and watermarket

序言 本次主要是弄清楚.批流统一 的处理方式,因为它是使用SQL来操作批流计算的.所以它怎么设置算子并行度?如何设置窗口?如何处理流式数据?等等 有很多疑问. 我还是觉得直接使用流计算的API更好.流批一体API最终也是转换成流式计算,最主要的是使用sql来设置算子或者窗口,并…

python合并多个excel,每个excel中有相同的列,按指定列名将数据列合并到一起。以统计学生多个作业提交情况为例。

一、实现目标 有多个excel文件,每个excel文件是一次学生作业的提交情况,最终统计出所有学生所有作业的提交情况。具体格式和内容如下: excel1.xlsx excel2.xlsx excel3.xlsx: 最后统计出所有学生提交的所有作业的情况: 二、实现思路

C# 自动备份文件

目录 文件目录如下 APBackUpFiles app.config OracleHelper LocalFileMethods LogFile packages.config ReadFile 如何发布 在工作的时候,遇到了需要定时对服务器的文件进行备份的需求,原因是 AP(服务器)上的空间不够了&a…

遗传算法解决TSP旅行商问题(numpy、pandas)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 目录 一、引言 原理: 问题: 二、思路步骤 三、代码编写步骤 A、代码各步骤的方法、目的及意义 1. 导入所需的库&…

测试人,你凭什么脱颖而出?

我们在软件测试面试时,可能经常会碰到HR这样问“与其他竞争者相比,你认为自己的优势在哪里?” 看似简单,但仔细深思可能心理陡然冰冰凉,因为自己难以有信心比他人突出(除了腰间盘),看…

DBA 抓包神器 tshark 测评

想窥探神秘的网络世界的奥秘,tshark 助你一臂之力! 作者:赵黎明 爱可生 MySQL DBA 团队成员,熟悉 Oracle、MySQL 等数据库,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户 MySQL 及我司自研 D…

chatgpt赋能python:Python火了原因分析

Python火了原因分析 Python语言是近年来最热门的编程语言之一,有很多原因可以解释它的成功。本文将介绍三个最重要的原因,以及如何利用这些原因来提高您的Python编程技能。 Python具有易学性和流行的库 Python的设计使它非常容易学习,尤其…

【机器学习】十大算法之一 “朴素贝叶斯”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

Visual Studio Code Arduino资源占用和效率对比

Visual Studio Code&Arduino资源占用和效率对比 系统资源占用:编译效率: 这段时间在玩ESP32,闲来无事对比了一下Visual Studio Code后面简称VS和Arduino的效率和资源占用,只是大致的对比,没有斤斤计较。 配置为&am…

springboot集成swagger

文章目录 swagger概述swagger常用注解ApiImplicitParam swagger的集成方式集成swagger2.9集成swagger2.10集成swagger3 swagger概述 swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具,在前后端开发之前,后…

Mysql数据库初体验

Mysql数据库初体验 一、数据库的基本概念1.数据(Data)2.表3.数据库4.数据库管理系统(DBMS)5.数据库系统 二、数据库系统发展史1.第一代数据库2.第二代数据库3.第三代数据库 三、当今主流数据库介绍四、数据库分类1.关系数据库2.关系型 SQL 数…

前端教程:Canvas怎样创建画布和绘制图形?

HTML5提供了一种全新的画布功能,即通过Canvas来让用户在网页中绘制图形、文字、图片等。Canvas表示画布,现实生活中的画布是用来作画的,HTML5中的Canvas与之类似,我们可以称它为“网页中的画布”。默认情况下,Canvas是…

【MySQL高级篇笔记-锁(下) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、概述 二、MySQL并发事务访问相同记录 1、读-读情况 2、写-写情况 3、读-写或写-读情况 4、并发问题的解决方案 三、锁的不同角度分类 1、从数据操作的类型划分:读锁、写锁 2、从数据操作的粒度划分&#xf…

攻防渗透第四章(谷歌语法)

一、常用谷歌黑客语法 制定网站的URL site: 包含特定字符的URL inurl: 网页标题中包含特定字符 intitle: 正文中指定字符 intext: 指定类型文件 filetype 开发语言判断 site:163.com filetype:php site:163.com filetype:jsp site:163.com filetype:asp site:163.com filetype…

工具篇--4 消息中间件-RabbitMq 模型介绍

1 介绍: RabbitMQ 是一个开源的消息中间件,它实现了 AMQP(高级消息队列协议)标准,并且支持多种语言和操作系统,包括 Java、Python、Ruby、PHP、.NET、MacOS、Windows、Linux 等等。RabbitMQ 提供了可靠的消息传递机制…

实战:单点登录的两种实现方式,你学会了吗?

概念 单点登录(Single Sign-On,SSO)是一种身份验证服务,允许用户使用单个标识来登录多个应用程序或系统。如下图所示,用户只需要用户名/密码登陆一次就可以访问系统A、系统B和系统C。 在传统的登录方式中,…

HTML5 progress和meter控件

在HTML5中,新增了progress和meter控件。progress控件为进度条控件,可表示任务的进度,如Windows系统中软件的安装、文件的复制等场景的进度。meter控件为计量条控件,表示某种计量,适用于温度、重量、金额等量化的表现。…

【CSS】文字扫光 | 渐变光

码来 可调整角度与颜色值来改变效果 <p class"gf-gx-color">我是帅哥</p> <style>.gf-gx-color {background: -webkit-linear-gradient(135deg,red,red 25%,red 50%,#fff 55%,red 60%,red 80%,red 95%,red);-webkit-text-fill-color: transparen…

中国物流成本高在哪里?怎么降低?

随着中国经济的快速发展&#xff0c;物流行业也得到了快速发展。然而&#xff0c;尽管中国物流行业的规模已经达到了世界领先水平&#xff0c;但中国物流成本也一直是业内关注的一个问题。那么&#xff0c;中国物流成本高在哪里&#xff1f;怎么降低呢&#xff1f;本文将从多个…