App 启动速度优化

前言​​​​​​​ 

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启动速度优化)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【服务器数据恢复】RAID5重建导致数据丢失的数据恢复案例

服务器数据恢复环境: HP某型号服务器,5块硬盘组建了一组raid5磁盘阵列。 服务器故障&分析: 服务器在工作过程中,raid5磁盘阵列中的一块磁盘掉线,由于raid5的容错特点,raid阵列未受影响,工作…

服务网格领域的百花齐放,是否存在一个更优解?

作者 lingsamuel,API7.ai 云原生技术专家,Apache APISIX Committer。作者 林志煌,API7.ai 技术工程师,Apache APISIX contributor。 服务网格是一种技术架构,它用于管理微服务系统中各个服务之间的通信,旨在…

Spring MVC入门笔记

Spring MVC基础知识 1. 创建web应用 新建Maven项目 点击File -> Project Structure -> Facets -> 号 -> Web 修改文件描述符路径为硬盘:\项目名\src\main\存储页面的文件夹(如:webapp)\WEB-INF\web.xml 修改Web页面路径为硬盘…

Spring Security --- Thymeleaf 中 Spring Security 的使用

目录 初步 获取属性 权限判断 初步 Spring Security可以在一些视图技术中进行控制显示效果例如:JSP或Thymeleaf在非前后端分离且使用Spring Boot的项目中多使用Thymeleaf作为视图展示技术Thymeleaf对Spring Security的支持都放在thymeleaf-extras-springsecurity…

数据清洗、数据处理入门!R语言我来了,数据不再零散!

一、引言 数据清洗和预处理是数据科学中必不可少的一部分,它们能够帮助我们准确地分析和预测未来趋势。如果你曾经尝试过进行分析或建模,你会发现数据往往不像我们所想象的那样干净、整洁。需要对数据进行仔细的检查、清理和处理,才能真正把…

VR全景营销颠覆传统营销模式,让商企博“出圈”

在激烈的市场竞争中,营销成为了商企博“出圈”的重要课题,随着5G的到来,VR全景迈入了快速发展时期,随着VR全景的普及应用,商业领域也逐渐引入了VR全景营销。 时下,商企的营销是越发困难,传统的营…

git安装以及git小乌龟使用

一、下载git 打开git官网地址:https://git-scm.com/进行下载 下载完安装,一直next就好,如果愿意就可以改下安装路径,改在d盘。 具体可以参考:git安装教程 二、安装完下载小乌龟以及语言包 下载地址:小乌龟…

redis到底是怎么样进行渐进式Rehash的

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。那么redis的底层是如何来存储数据的呢? 一、redis如何在存储大量的key时候,查询速度还能接近O(1)呢&#xf…

DAY 77 [ Ceph ] 基本概念、原理及架构

前言 在实现容器化的初期,计划使用 Ceph 作为容器的存储。都说存储是虚拟化之母,相对容器来说,存储也起到了至关重要的作用。 选用 Ceph 作为容器化存储理由如下: 方便后期横向扩展;Ceph能够同时支持快存储、对象存…

SF授权系统源码 V3.7全开源无加密版本

🎉 有需要的朋友记得关赞评,文章底部来交流!!! 🎉 ✨ 源码介绍 2023全新SF授权系统源码 V3.7全开源无加密版本。网站搭建很简单,大致看来一下应该域名解析后上传源码解压,访问域名/i…

全志V3S嵌入式驱动开发(u盘写读)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于现在的soc来说,基本上usb是标配的。它一般需要支持usb host、device和otg三种模式。简单解释下,host模式,就…

STM32F407移植1588v2(ptpd)

硬件: STM32F407ZGT6开发板 软件: VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example,因为和F407差别很小,所以就打算用这个demo移植到手头的开发板上。因为目前只需要…

ASP.NET MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定。总地来说,我们可以采用4种不同的编程模式来进行针…

DevExpress WPF功能区控件,更轻松创建应用工具栏!(上)

DevExpress WPF的Ribbon、Toolbar和Menus组件以Microsoft Office为灵感,针对WPF开发人员进行了优化,可帮助您在段时间内模拟当今最流行的商业生产力应用程序。 DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业…

百度CDN配置TLS

概述 为了保障您互联网通信的安全性和数据完整性,百度智能云CDN提供TLS版本控制功能。您可以根据不同域名的需求,灵活地配置TLS协议版本。 TLS(Transport Layer Security)即安全传输层协议,在两个通信应用程序之间提…

LeetCode·每日一题·1177. 构建回文串检测·前缀和

作者:小迅 链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获…

全景浏览技术在虚拟现实中的应用

随着虚拟现实技术的发展,全景浏览技术越来越受到人们的关注。全景浏览技术是一种可以将场景全方位呈现给用户的虚拟现实技术,可以为用户带来身临其境的视觉和听觉体验。本文将介绍全景浏览技术在虚拟现实中的应用以及如何利用代码实现这些应用。 一、全…

第五节 利用Ogre 2.3实现雨,雪,爆炸,飞机喷气尾焰等粒子效果

本节主要学习如何使用Ogre2.3加载粒子效果。为了学习方便,直接将官方粒子模块Sample_ParticleFX单独拿出来编译,学习如何实现粒子效果。 一. 前提须知 如果参考官方示例建议用最新版的Ogre 2.3.1。否则找不到有粒子效果的示例。不要用官网Ogre2.3 scri…

6.17黄金反弹是否到顶,下周开盘如何布局

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:黄金周五(6月16日)小幅收高,但在触及5月以来最低盘中水准后本周以下跌收官。美市尾盘,现货黄金收报1957.68美元/盎司,下跌0.19美…

vmware设置centos客户机和windows宿主机共享文件夹

一、安装内核 kernel-devel 包 yum install gcc yum install kernel-devel-$(uname -r) 注意,如果自己修改过内核版本,需要确保 uname -r 显示的版本和实际使用的内核版本一致。 二、安装 vmware-tools 在vmware上点击菜单:虚拟机->安…