android 提高启动速度慢,提高App的启动速度,你真的做对了吗?_Wang Namelos的博客-程序员宅基地

技术标签: android 提高启动速度慢  

1、前言

App的启动速度是用户对于App的第一印象,如果App启动的很慢那非常有可能导致用户的流失,因此对于App的启动速度可以说是我们必须要保障的一道关卡!接下来我给大家介绍一下App启动速度优化的常用方案。

2、衡量启动时间

要想优化启动速度首先我们需要知道怎么精确获取App的启动速度,只有先拿到了精确的启动速度才好评估时间到底有多久以及后续的优化效果。对启动速度优化有经验的同学都知道使用 adb shell am start -W 首屏Activity 这个命令可以拿到App的启动速度,一般App做启动速度统计都是这么做的。

那这么做真的可以吗?

答案肯定是No,首先这种adb 命令的方式只能在线下才能使用,这也就意味着如果使用了这种衡量方式,我们在线上根本无从知道用户在实际情况下到底慢还是不慢以及慢的程度,这其实是不可接受的,因为线上用户的实际优秀体验才是我们追求的目标。其次对于这个命令拿到的值,它只是到了Activity的第一帧而已,也就是并不能够代表用户实际看到我们App这个界面了。举个例子:当首页是一个列表的时候,列表的数据需要网络传输回来,那Activity的第一帧早就绘制了,但是用户看不到真实的数据,这样的用户体验依然很糟糕。所以adb 这种方式拿到的启动时间并不能够真实的反映出来用户实际真正看到首页需要的时间。

总结一下这种常规方案的缺点:

只能在线下使用

不能准确的表现出用户实际的体验

因此更建议大家自己精确的埋点来统计启动时间,关于如何判断启动的结束以及优雅获取启动时间的方法欢迎查看《国内Top团队大牛带你玩转Android性能分析与优化》

3、实际优化

启东速度慢的话我们来进行优化,一般情况下必不可少的就是异步初始化优化,也就是使用异步的方式来分担主线程的工作达到加快启动速度的目的。这里也就涉及到了多线程的使用,实际上这是启动优化中非常重要的一种手段。

但是异步初始化优化就可以解决启动速度慢的所有问题吗?Naive!异步初始化虽然有效,但是我们来想想它可能遇到的问题:主线程中执行的任务如果需要异步初始化中执行的任务配合(也就是有依赖关系),这种情况下怎么处理?简单的说就是要保证异步初始化的某项任务一定要在主线程的某个时刻前执行完成,怎么办?如果你提前这个异步任务也只能保证这个异步任务提前开始而已,你无法保证在每个手机上这项任务一定会在主线程的某个时刻都提前执行完成!

再者:假设你在Application的onCreate中做了异步,但是一些异步的任务需要在onCreate执行完成之前就结束,因为Splash界面可能会直接使用到这些任务。这种情况该怎么处理呢?万一这种情况特别多,怎么处理起来更加优雅呢?

4、延迟初始化

做过启动优化的同学肯定都知道我们可以将部分不重要的任务挪到启动结束之后再去执行,讲道理这也是一种有效的减少启动速度的方法。 但是如果我延迟执行的任务总共需要1000ms才能全部执行完成,那岂不是启动完成之后主线程还要被卡顿1000ms,在这个过程中如果用户有滑动屏幕或者是点击事件等操作呢肯定是执行不了的,用户一定会感受到卡顿,也就是界面虽然打开了但是用户还是操作不了,体验也是非常的差!

这个方案很常见,但是如果用的不好的话很有可能会导致用户虽然看到了界面但是无法操作。因此需要一种特殊的机制来保障即便是使用了延迟初始化也不会影响用户的任何操作。

5、后记

关于App的启动速度优化我在这里提出来几个常见的优化误区,很多时候常规的优化方案如果使用不正确反而会起负面作用,因此需要有更先进的方案来指导我们的优化工作。关于文中所介绍的方案以及问题解决途径,欢迎查看《国内Top团队大牛带你玩转Android性能分析与优化》,让我们一起成为高级工程师吧!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35097989/article/details/117664612

智能推荐

scss值列表_Sass中的数据类型_weixin_40003512的博客-程序员宅基地

数据类型几乎在所有编程语言当中都有,在Sass中也不例外。数据类型是根据不同的用途分的类。例如2是一个数值(number),而SitePoint是一个字符串(string)。在这篇文章中,将涵盖Sass中所有的数据类型(共有七种数据类型),并且通过一些简单的例子来阐述这些数据类型在Sass中如何使用。Nullnull是Sass中最基本的数据类型,它既不是true也不是false,而表示的是空。它没...

win10安装opcenum_U盘安装WIN10时显示 windows无法安装到这个磁盘 选中的磁盘采用GPT分区形式..._CRomputer-罗军的博客-程序员宅基地

一、原因分析win8/win10系统均添加快速启动功能,预装的win8/win10电脑默认都是UEFI引导和GPT硬盘,传统的引导方式为Legacy引导和MBR硬盘,UEFI必须跟GPT对应,同理Legacy必须跟MBR对应。如果BIOS开启UEFI,而硬盘分区表格式为MBR则无法安装;BIOS关闭UEFI而硬盘分区表格式为GPT也是无法安装Windows。(注意事项:转换分区表格式会清空硬盘所有...

Unity 在Game窗口下显示mesh_皮皮#2500的博客-程序员宅基地_unity 显示mesh

Unity 在Game窗口下显示mesh问题描述实现方法问题描述在Scene窗口中,当我们点击一个物体时,会显示出一个物体的纹理:但是在Game窗口中,我们时看不到这个纹理的:目标:希望在Game窗口中可以看到和Scene窗口中一样的纹理效果。实现方法安装插件Wireframe将解压后的工程放到Unity工程Asset文件夹下:在Unity中,新建一个材质球,然后将Wireframe文件夹下的UCLA GameLab Wireframe.sh着色器附加到新建的材质球上:将材质球附加

mui:第一次在AppStore 上线应用_前行中632的博客-程序员宅基地

时间:在第一天上午发布,第二天早上便通过了,所以整体还是很快的 过程:整体是一个开发了差不多有两个月的项目—易沃克,从最初的一无所知的忐忑,到最后的淡然,感觉受益良多,(闲话少说) 这是H5的项目,是基于mui框架的基本模型,总体上是有js和html语言写成,并已经实现了具体的功能,可以投入使用,但作为一个H5文件,不可避免的就是他的性能瓶颈,他的刷新可以说是令人很不满意的,我使用的是appup

关于Redis远程连接Linux虚拟机(Centos 7)或IDEA的问题_老码的博客-程序员宅基地

关于Redis远程连接Linux虚拟机(Centos 7)或IDEA的问题今天在学习Redis中遇到了一点小问题:使用Xshell远程连接虚拟机时,无法成功连接,需要切换到桥接模式使用IDEA远程连接,与SpringBoot项目集成时,无法Ping通,无法成功连接由于桥接模式下ip地址每次启动虚拟机都会不同,也就意味着需要在Xshell中多次配置连接的ip,所以一般我们都选择通过Nat连接。但是虚拟机设置了通过Nat连接后,我发现不能成功连接到Xshell,所以需要以下设置:首先进入Red

查找IIS的80端口被占方法_SKY徐的博客-程序员宅基地

运行cmd,键入netstat -ano,找到80端口,查看其对应的PID为720, 然后打开任务管理器,点击查看-选择列,勾上PID,确定,以显示进程的PID信息,然后打开进程去找对应的PID为720的进程,这个进程就是占用80端口的进程,结束掉即可运行你的IIS了,或是想办法把端口改了,或是改IIS的也行,

随便推点

There are 0 datanode(s) running,解决Hadoop启动时,没有启动datanode_闷声$的博客-程序员宅基地

向Hadoop上传文件时出现错误:There are 0 datanode(s) running and no node(s) are excluded in this operation.,用jps命令查看发现datanode没有启动。解决:

transE论文阅读 19年记录的_peaceminusvip的博客-程序员宅基地_transe论文

论文标题:Translating Embeddings for Modeling Multi-relational Data——NIPS2013论文链接https://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Paper.pdfhttps://proceedings.neurips.cc/paper/2013/file/1cecc7a77928ca8133fa24680a88d2f9-Pa.

java jar class_JAVA jar命令(一)-jar打包class文件_数据汪的博客-程序员宅基地

jar包本质上是将所有class文件、资源文件压缩打成一个包(也可以选择不压缩),可选择在jar包中生成META-INF/MANIFEST.MF文件,MANIFEST.MF是清单文件,里面可以记录主类、classpath等信息,供虚拟机使用。接下来的一段时间里,我们将以以下路径学习jar命令和清单文件的相关知识jar打包class文件带包class文件jar打包清单文件的使用在这篇文章里我们将使用...

Hibernate注释大全_zhugeyangyang1994的博客-程序员宅基地

每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用@Entity 注解来进行声明。声明实体[email protected] class Flight implements Serializable {  Long id;  @Id  public Long getId() { return id; }  public void setId(Long

html避免多次点击选中页面文字或者内容时出现蓝色背景_chengchengbox的博客-程序员宅基地

在body、html中添加以下代码*,body,html{ -moz-user-select: none; /*火狐*//*选中文字时避免出现蓝色背景*/ -webkit-user-select: none; /*webkit浏览器*//*选中文字时避免出现蓝色背景*/ -ms-user-select: none; /*IE10*//*选中文字时避免出现蓝色背景*/ user-select: none;/*选中文字时避免出现蓝色背景*/}...

PHP拼团人数不能超过,怎么解决拼团、抽奖难以凑齐人数这个大问题?_weixin_39552472的博客-程序员宅基地

原标题:怎么解决拼团、抽奖难以凑齐人数这个大问题? 相信大家都参与过小程序组团、互动类的活动,通常是要等到人数达到规定人数后,活动才能够开始进行。在发起人发起了一个小程序拼团活动、抽奖活动……转发给多个微信好友后,再等待人数集齐,但是,并不是所有好友都会第一时间加入活动,这就需要反复点击查看人数参与进度,以便活动开始。 然而,不断地点击查看人数会消磨掉用户的热情和耐心,用户也会在等待中遗忘或是直接...