android 启动优化方案,Android 项目优化(五):应用启动优化

介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明。

一、App启动概述

一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。

应用程序启动有主要分为两种状态,每种状态都会影响应用程序对用户可见所需的时间:冷启动,热启动。

冷启动:冷启动表示用户首次打开应用,这时进程还没创建,包含了Application创建的过程。冷启动时间指从第一次用户点击Launcher中的应用图标开始,到首页内容全部展示出来。

热启动:热启动表示用户在首页按了返回,首页Activity已经Destroy,不过Application仍在内存中存在,对应的进程并没有被杀掉,不包含Application创建过程。热启动时间指在Application仍然存在的情况下,从用户点击桌面图标,到首页内容全部展示出来。

注:冷启动、热启动不是官方的定义,而是我们基于用户的角度考虑的定义。

在冷启动开始时,系统有三个任务。这些任务是:

加载并启动应用程序。

启动后立即显示应用程序空白的启动窗口。

创建应用程序进程。

一旦系统创建应用程序进程,应用程序进程就会负责下一阶段。这些阶段是:

创建App对象

启动主线程(main thread)

创建应用入口的Activity对象

填充加载布局Views

在屏幕上执行View的绘制过程.measure -> layout -> draw

应用程序进程完成第一次绘制后,系统进程会交换当前显示的背景窗口,将其替换为主Activity。此时,用户可以开始使用该应用程序。

这里我们建议始终根据冷启动的假设进行优化。这样做也可以改善热启动的性能。

二、冷启动视觉效果优化

上面我们说了,冷启动的阶段执行的操作为:

加载并启动应用程序

启动后立即显示应用程序空白的启动窗口

创建应用程序进程

现在 App 应用启动都会先进入一个闪屏页(LaunchActivity) 来展示应用信息。

系统默认会在启动应用程序的时候启动空白窗口 ,直到 App 应用程序的入口Activity创建成功,视图绘制完毕。但是存在的问题就是在进入闪屏页的时候,会有2秒左右的白屏/灰屏的界面。

为了更顺滑无缝衔接我们的闪屏页,可以在启动 Activity 的 Theme中设置闪屏页图片,这样启动窗口的图片就会是闪屏页图片,而不是白屏。配置代码如下:

@drawable/lunch//闪屏页图片true

false

这样设置的话,就会在冷启动的时候,展示闪屏页的图片,等App进程初始化加载入口 Activity (也是闪屏页) 就可以无缝衔接。

其实这种方式并没有真正的加速应用进程的启动速度,而只是通过用户视觉效果带来的优化体验。

备注:上面的方案适用于闪屏页为整张图片为闪屏内容(闪屏页图片推荐.9格式,防止拉伸失真)。不适用于闪屏页为多个元素混合的。后者推荐参考Android 项目优化(二):启动页面优化。

三、App冷启动耗时统计

App冷启动耗时统计方式主要是:adb 命令统计、系统日志统计。

1. adb 命令统计

adb命令 : adb shell am start -S -W 包名/启动类的全限定名 , -S 表示重启当前应用。示例如下:

C:AndroidDemo>adb shell am start -S -W com.example.moneyqian.demo/com.example.moneyqian.demo.MainActivity

Stopping: com.example.moneyqian.demo

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.moneyqian.demo/.MainActivity }

Status: ok

Activity: com.example.moneyqian.demo/.MainActivity

ThisTime: 2247

TotalTime: 2247

WaitTime: 2278

Complete

ThisTime : 最后一个 Activity 的启动耗时(例如从 LaunchActivity - >MainActivity「adb命令输入的Activity」 , 只统计 MainActivity 的启动耗时)

TotalTime : 启动一连串的 Activity 总耗时.(有几个Activity 就统计几个)

WaitTime : 应用进程的创建过程 TotalTime .

总结一下 : 如果需要统计从点击桌面图标到 Activity 启动完毕,可以用WaitTime作为标准,但是系统的启动时间优化不了,所以优化冷启动我们只要在意 ThisTime 即可。

2. 系统日志统计

根据系统日志来统计启动耗时,在Android Studio中查找已用时间,必须在logcat视图中禁用过滤器(No Filters)。因为这个是系统的日志输出,而不是应用程序的。

比如我们可以通过过滤displayed输出的启动日志. 示例如下:

0b4c6bc273bfe72eef5ae4c23ff58693.png

四、冷启动 Application 优化

我们知道有很多第三方组件(包括App应用本身)都在 Application 中完成初始化操作。但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能。

通过分析一下,我们可以知道还是有机会优化这些工作以实现冷启动的性能改进的,分析后发现影响冷启动时间的常见问题如下:

复杂繁琐的布局初始化

阻塞主线程 UI 绘制的操作,如 I/O 读写或者是网络访问.

其它占用主线程的操作

我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :

必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)

组件一定要在主线程中初始化,但是可以延迟初始化。

组件可以在子线程中初始化。

在进行优化的时候,需要注意以下几种情况:

放在子线程的组件初始化建议延迟初始化,这样就可以了解是否会对项目造成影响!

将需要在主线程中初始化但是可以不用立即完成的动作延迟加载(初始化放在 Application 中统一管理为妙,不建议放在Activity里面)

可以尝试将常见的组件库,例如 Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)

在优化好启动时间后,我们就可以在针对闪屏页的时间,进行调整优化,具体公式为:

闪屏页展示总时间 = 组件初始化时间 剩余展示时间

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

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

相关文章

排序总结

排序总结 快速排序基本思路: 基本思想: 1)选择一个基准元素,通常选择第一个元素或者最后一个元素, 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值…

iphone最新款手机_苹果用户不换安卓手机的8点原因,最后一点最关键

快速的更新换代似乎已经成为了安卓手机的发展规律。与之相比,苹果公司的发展却逐渐从之前的“特立独行”变为了“固步自封”,产品风格也由原先的桀骜不驯,转变为现在向市场的不断妥协。即便如此,仍旧有很大一部分苹果用户没有考虑…

windows和android双系统平板,Windows平板打造双系统爽玩安卓APP

随着微软的surface更新换代, Windows平板是越来越受欢迎,在工作上,win平板处理办公文件和兼容性的优点得到了大家认可。但是在视听娱乐等休闲方面,始终还是没有安卓平板来的好用,而且安卓平台有大量好玩的APP&#xff…

ilitek win10 触摸屏驱动_想做多大尺寸触摸框找融创方圆定制触摸屏工厂

融创方圆定制大尺寸拼接屏多点触摸屏,大屏拼接屏红外多点触摸框,触摸拼接屏,拼接触摸屏,触摸拼接墙,拼接墙触摸屏,我们大尺寸多点触摸框反应灵敏,无盲区,无鬼点,无漂移&a…

linux 电台,linux下架设个人电台的方法

两年前(基本上刚好是两年了),我还在用windows的时候,曾经写过一篇win下架电台的文章,后来不用windows了,基本上也就没搞过这个事情了,最近看到有个icecast,就忍不住试了一下,在这里汇报下结果。…

most recent call last 报错_视频|救援情景剧、创意快闪……400w+人次为重庆这场消防宣传活动打call...

鼎牛配资app西安笑赢配资大赚配资公司推选简配资乐赢资本 昔日,两江新区2020年“119”消防宣扬月启动典礼正在重庆欢欣谷盛大举办。两江新区消防供图华龙网-新重庆客户端 收华龙网-新重庆客户端11月4日18时40分讯(记者 李华裔)按照实在救济动作改编的情形剧、小伴侣…

主机数,子网数,网络号,主机号

IP地址分类: A类:000~127,默认子网掩码:255.0.0.0 B类:128~191,默认子网掩码:255.255.0.0 C类:192~223,默认子网掩码:255.255.255.0 D类:224~239 …

html中使用什么标签做的导航栏_自媒体人如何自己建立一个手机网站,超简单,任何人都能做...

随着移动互联网的兴起,越来越多的公司、个人把展示的内容转到了手机网站上,学会制作手机网站就成了大家关注的热点。传统的网页制作工具制作电脑端的网站功能很强大,但手机网站由于手机屏幕大小和CPU处理能力较弱,对网站的要求与传…

荣耀有鸿蒙手机吗,惊喜!荣耀手机也能升鸿蒙:这5款机型用户有福了

今天上午,华为Mate X2 4G版折叠屏手机曝光,这款手机的主要配置和华为Mate X2 5G版本几乎一模一样,处理器也是使用麒麟9000,但是不支持5G网络。去年下半年,华为推出了Mate系列年度旗舰,包括Mate 40、Mate 40…

哈夫曼编码和带权路径计算

哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为: 图a: WPL5*27*22*213*254 图b: WPL5*32*37*213*148 可见,图b的带权路径长度较小,我们可以…

codesys raspberry pi_11月7日|Pi第四次减产来袭?4点浅析中文区用户关心的问题

手里有派,心中有爱这两天一些派友私下找我在抱怨,也有用户在我们的微信社群发出所谓的灵魂询问:“主网在哪里??制宪大会在哪里?停产或者减产在哪里?kyc在哪里?”我简单的回应一下&am…

android微信h5转原生支付,微信原生支付流程以及踩坑

本次记录的是微信“JSAPI”的支付方式 也就是微信内H5页面调起支付,其他支付方式也大同小异,总体的流程和思路大致是一样的,基本配置方面就不详细记录,只需要商户号和商户Key,这个是配套的,还有跟商户号绑…

python编程学习做什么-什么样的人要学点python编程?请你对号入座

什么样的人需要学点python编程? 时代越来越不一样了,编程这种专业程序员的工作,已经开始应用于各种其他日常工作中,就以前象征着互联网的电脑,现在早已进入普通人家。 那么什么样的人需要学点python编程呢?…

android 网页取词,有道词典屏幕取词怎么用?,你知道吗?在浏览网页

有道词典屏幕取词怎么用?,你知道吗?在浏览网页你知道吗?在浏览网页时遇到不懂的外文、词语等,我们可以通过有道词典的屏幕取词来进行翻译哦!好吧,你肯定会问:我如何使用这一功能呢?下…

你发这些什么目的_微信CRM系统究竟是什么?

作为一个电商运营人,近期行业内经常会听到一个名词,微信CRM系统,私域流量,用微信CRM系统打造属于自己的私域流量。相信很多做电商的也是和我一样,对于这个词很耳熟,但是又不知道是什么意思,因此…

C++ 输入有空格一行的接收

#include<iostream> #include<string> using namespace std; int main() {char input_str[100]; //输入有空格的一行。cin默认以空格结束cin.getline(input_str, 100);int num_num 0;int num_letter 0;int num_space 0;int num_other 0;int len strlen(input…

android微信支付坑,微信支付踏坑之旅

其实微信支付的集成步骤也就那么几步&#xff0c;奈何第一次接触无论是微信官方文档还是5SDK文档都看的晕头转向&#xff0c;于是我换个思路(以下只针对android app支付功能&#xff0c;服务端为java)1、首选确定app已经开通支付功能&#xff0c;确保 包名、应用签名、appid、m…

通过conda安装imgaug

直接采用pip install imgaug 错误 需要先安装sharply包 输入命令&#xff1a; conda install -c conda-forge shapely 然后输入命令&#xff1a; pip install imgaug 或者&#xff08;当上面安装命令出现超时等错误时&#xff09; pip install imgaug -i https://pypi.t…

多个服务器数据互通_5月23日部分服务器数据互通公告!

为了提升游戏品质&#xff0c;给各位仙友创造更好的游戏环境&#xff0c;我们将于5月23日6:00对部分服务器进行“数据互通”操作&#xff0c;开服待定。参与合服的服务器可参与合服活动&#xff0c;详细请合服后登录游戏查看。服务器“数据互通”后&#xff0c;原登录界面上的服…

conda安装tensorflow-gpu

1、安装Anaconda Anaconda下载地址&#xff1a;https://www.anaconda.com/download/ 选择合适的版本&#xff0c;进行下载安装即可。 下载完成后就双击安装就可以了 一步一步按照默认的来就可以了&#xff0c;注意一下&#xff0c;注意勾选添加到环境变量&#xff0c;不然后面…