前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >5分钟教你打造一个秒开的 Android App

5分钟教你打造一个秒开的 Android App

作者头像
腾讯Bugly
发布于 2023-04-02 06:14:41
发布于 2023-04-02 06:14:41
77000
代码可运行
举报
文章被收录于专栏:腾讯Bugly的专栏腾讯Bugly的专栏
运行总次数:0
代码可运行

背景

近日在开发过程中,发现每次点击app从桌面启动都有一个在桌面明显的等待时间,机型越低端的越明显,冷启动优化看来已经势在必行,所以怒而一顿研究再解决之。话不多说先上优化前后效果图:

买家秀(gif):

淘宝秀(gif):

Android App启动流程:

俗话说要想优化好,流程不可少!关于android app启动的流程图如下:

总结一下一个完成的冷启动app过程应该是经过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Zygote Fork Proccess
-> Application:attachBaseContext()
-> Application:onCreate()
-> MainActiviity:onCreate()

这里主要是把相应的生命周期回调写出来。 因为一般大家的业务代码都是在这些函数回调中调用。

App冷启动相关优化点

1.   生命周期内减少耗时操作:

·  Application:attachBaseContext():

这个方法中一般雷区主要都在这句代码上,因为在Android 5.0(API 21) 以下会存在65535方法数分包的问题,当dex过大时会导致Application启动慢, ANR或者ClassNotFound等异常,关于分包解决和优化方案网上一堆就不在做赘述了。

·   Application:onCreate()

这个方法是需要重点优化的,因为大家的第三方插件初始化一般都会放在这里,在Application初始化做繁重的东西会严重阻塞app启动(DiskIO,网络请求等)。以下是我们第三方插件初始化的耗时:

debug:

release:

这里把debug和release下的时间都贴出来,是希望大家不要重蹈覆辙。。。  因为debug模式下和release模式下一个是1000ms左右, 一个是300ms左右,误差很大,请大家一定要在release下测试数据!!!!

针对于解决第三方插件初始化耗时方案一般是: 1.SDK分优先级加载,非必要SDK由懒加载实现。 2.可以多线程初始化的sdk由多线程方式来进行初始化。

· MainActiviity:onCreate()

同上一样,尽量不要在此布局做一些耗时的操作或者呈现一些过于复杂的布局。在具体分析自己的app时发现onCreate中有这样一行代码:

其作用是希望用户在打开时,一定能看见Splash的画面,主动延迟了1s加载。这里其实有更好的解决办法处理,则是把跳转MainPage的方法放在onResume中而不是放在onCreate中。因为Android系统中onResume一定是处于可见可交互的状态,用户一定能看见SplashActivity再去跳转,由系统生命周期决定,而不是固定的等待1s,此处优化后启动速度又提升了500ms。所以建议大家以后还是遵循生命周期去做一些事情,尽量别进行人为延迟阻塞。

2. 避免冷启动

App启动方式一般有3种:

· ColdStart ——冷启动:

此种方式最为耗时,一般是因为进程被干掉,系统需要重新fork进程进行一系列初始化。

·  WarmStart ——暖启动

比ColdStart稍快,因为app的所有Activities还常驻在内存中,并没有被杀掉,所做的只是把app从后台提到前台来展示,并不需要重走初始化一系列行为,减少了对象初始化、布局加载等工作。但其行为表现与冷启动一致,是会displays a blank screen直到App渲染activity。这个blank screen后面会解释。

· LukeWarm Start——热启动

启动方式最快,类似于返回键退出应用又立即进入的那种行为。

优化方案:

既然冷启动那么慢,我们就在非用户主动kill进程或系统通知kill进程的其他情况下不再主动退出进程。那答案很简单了,就是在位于Activity栈底activity中Hook其返回键行为,保证用户点击返回键后不再退出app。在我们App里位于我们栈底的一定是我们的MainActivity,因为一系统行为都是由其向下衍生的。所以只需加入以下几句话:

moveTaskToBack:作用是不再Finish到此Activity,仅仅是把它放到后台隐藏。类似于用户主动触发系统Home键的效果。在同是点击返回键优化前后的对比如下:

优化前(gif):

优化后(gif):

若图1中时间久后进程回收后优化效果会更为明显。

3.WindowBackGround——脱下秒开的最后一层薄丝袜

经过上面一顿操作后,我发现然并卵!!!启动速度是提升了,但是App一点击还是会在桌面停顿一下。哇呀~很难受~细细思考了一下,一个APP启动无论如何都是会新Fork进程,难道就是这个问题导致其在桌面上停顿一会儿?那其他app又是怎么做到秒开的呢?在AndroidDeveloper的Launch-Time Performance有这么一句话:

其实在创建App进程时,android系统会为你立即显示一个background window,然后再去创建app进程,当app完成first draw时,会立即由你的MainActivity(即默认启动的Activity)替换掉它。这里的background window就是上文WarmStart中提到的blank screen。谜底到此解开所谓的秒开原来就是视觉欺骗。。。所以说有人给你说他只是仅仅是优化生命周期内初始化代码达到秒开都是扯淡。但不得不承认这样用户体验大大的提升了,一点击launcher就渲染好一个背景图片,给用户一种已经启动的感觉,前面做的一系列优化,不过为了让用户少看一会儿系统给渲染的black window。

那为什么我们的APP会出现在系统桌面上停留一会,而不是渲染背景图呢?原来在项目创建时,系统会为launcherActivity默认了一个LightTheme,这样就会导致App点击启动后会白屏一段时间然后展示自己的Activity,为了解决白屏的问题把theme主题换成透明的就像下面

但其实这样虽然解决了白屏的问题,但是就会出现上文所说的,点击后停留在桌面一会儿,直至MainActivity渲染出来。这是大部分App的做法,但并不是最佳解决方案。

WindowBackground最佳解决方案:

应该由windowBackground此属性作为你的品牌推广页或者logo页,如果你的SplashActivity完全不需要做任何初始化,只是希望有个闪屏页,完全可以由windowBackground来满足。

1.设置自定义带windowBackground的Theme

前两行代码是设置Theme不透明并且默认渲染的背景图是我们必看影视闪屏页的图片。

  • windowBackground:关键,主要设置你想要的背景图或者是动态自绘的drawable皆行,这个视图会在你冷启动时渲染给用户过渡看。
  • windowFullscreen:全屏展示,免得顶部状态栏显现颜色不一致过于脱节和突兀

2. 为你的launcher Activity设置你的启动Theme

3. 在Launch Activity启动后再把主题设置回自己的AppTheme

此时你的App就能完成秒开了!

推荐测试工具

最终我们App从launcher点击到第一个Activity渲染完成总共需要时间是888ms,很吉利!

·  Time to full Display

上图的那行日志是由系统打印出来的,意思就是渲染Acitivity所需要的时间,如果是第一个Activity启动时长也是算在内的。 在Android4.4(API19)以上才会有此Log打出,在verbose级别搜索Displayed即可。不仅可以看自己的还可以看到其他APP的启动时长。

附带一张小米4上业界各大App的冷启动时长~仅供参考~

· Hugo

执行时间打印神器,集成至项目后,只需在想要测试的地方加上注解即可:

可以是class级别,也可以是函数级别。如果注解是Appication类级别,还会把各大生命周期回调函数执行时间打印出来及其方便!(https://github.com/JakeWharton/hugo)

效果如下:

·  Stetho

这是非死不可出的调试神器,如果开发android这个没用过的话,你一定会觉得相见恨晚!


如果您觉得我们的内容还不错,就请转发到朋友圈,和小伙伴一起分享吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯Bugly 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5分钟教你打造一个秒开的 Android App
MatthewF
2017/07/04
4.4K3
5分钟教你打造一个秒开的 Android App
优化App冷启动,实现启动页错觉秒开
APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,这可能会让用户会以为没有点到APP而再次点击,极大的降低了用户体验,Android需要及时做出反馈去避免这段时间的尴尬。于是系统会根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。这个黑(白)屏就称为Preview Window,即预览窗口。
木溪bo
2018/12/27
2.1K0
冷启动与热启动,AsyncTask,HandlerThread,IntentService,Service 保活,IntentService
app冷启动: 当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, 这个启动方式就叫做冷启动(后台不存在该应用进程)。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
zhangjiqun
2024/12/16
1360
Android性能优化系列之App启动优化
应用的启动速度缓慢是我们在开发过程中经常会遇到的问题,比如启动缓慢导致的黑屏,白屏问题,本篇博客就将介绍App启动优化的相关知识。
老马的编程之旅
2022/06/22
7490
Android性能优化系列之App启动优化
你的 APP 为何启动那么慢?
可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。
刘盼
2019/05/08
2K0
你的 APP 为何启动那么慢?
2019 Android 高级面试题总结 从java语言到AIDL使用与原理
a.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景比如最常见的AlertDialog,拿我们开发过程中举例,比如Camera开发过程中,可能需要设置一个初始化的相机配置,设置摄像头方向,闪光灯开闭,成像质量等等,这种场景下就可以使用建造者模式
Android技术干货分享
2019/03/27
9060
性能优化(一)APP 启动优化(不敢说秒开,但是最终优化完真不到 1s)
这里也许会有人问 APP 启动还需要优化吗?启动又不是我们自己写的代码,难道 Google 工程师会犯这么低级的错吗?其实这还真不是 Google 的错,应该说是给我们开发者留了一个坑吧。应该有的同学知道是怎么一回事儿了,当我们在系统桌面任意点击一个 APP 是不是会发现启动的时候有一瞬间有白屏出现(以前老版本是黑屏) 那么我们怎么来优化这个黑白屏的问题勒,现在我们先来了解一下 Android 手机重开机到启动 APP 的过程吧。
Android技术干货分享
2019/05/10
9120
性能优化(一)APP 启动优化(不敢说秒开,但是最终优化完真不到 1s)
Android 启动优化说明、黑白屏处理
Android 启动优化说明、黑白屏处理 前言 正文 一、启动来历 二、启动说明 1. 冷启动 2. 热启动 3. 温启动 4. 冷启动流程 5. 优化时间 6. 优化方案 三、黑白屏处理 1. 创
晨曦_LLW
2022/03/11
1.2K0
Android 启动优化说明、黑白屏处理
一触即发——App启动优化最佳实践
一触即发 App启动优化最佳实践 本篇是我的原创,我又回来啦~ 文中的很多图都是Google性能优化指南第六季中的一些截图 Google给出的优化指南来镇楼 https://developer.an
用户1907613
2018/07/20
1.4K0
你必须要掌握的Android冷启动优化
事件发生在发包上线的前两天,在某某云进行移动测试时,提示冷启动速度低于平均值的问题,之前自己也曾尝试过优化,但是发现效果并不是很明显,作为一个有追求的开发者,趁着有点空闲时间,要好好研究一下冷启动优化问题。
用户1269200
2018/12/07
1.8K0
Android 性能分析学习(启动速度优化)
启动速度是用户体验app的第一感官,所以如果APP卡顿的话,给用户的体验会非常的糟糕。 本文主要针对这点进行的分析学习以及记录。
艳龙
2021/12/16
9420
Android 性能分析学习(启动速度优化)
Android性能优化笔记(一)——启动优化
从上面的总结可以看出,在应用的启动过程中,冷启动是最慢最耗时的,系统以及应用本身都有大量的工作需要处理,所以,冷启动对于应用的启动速度是最具挑战以及最有必要进行优化的。
分你一些日落
2021/12/13
1.1K0
Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
App启动方式分三种:冷启动(cold start)、热启动(hot start)、温启动(warm start)
233333
2024/06/28
4500
Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
Android-App性能优化
上一篇我们讲了java的引用机制,今天我们来一下和它有关的app性能优化(其实也不是很大)。
android_薛之涛
2018/09/12
2.3K0
Android-App性能优化
App冷启动,你还要我怎样?
首先我们得知道为什么会出现这个白屏的,在AndroidManifest.xml配置文件里面,你会看到你的LAUNCHER activity的配置
Android技术干货分享
2020/04/23
1.8K1
App冷启动,你还要我怎样?
Android面试题之App的启动流程和启动速度优化
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
AntDream
2024/06/24
1680
Android面试题之App的启动流程和启动速度优化
App冷启动与启动白屏处理
近日在开发过程中,发现每次点击app从桌面启动都有一个在桌面明显的等待时间,机型越低端的越明显,冷启动优化看来已经势在必行,所以怒而一顿研究再解决之。 1冷启动 第一次启动、被用户杀死进程或系统自动回收进程后,整个app后台任务被清理,再次启动app,称为 冷启动。 特点:后台任务全部结束,回收进程 2热启动 用户点击返回键退回界面,后台任务没有杀死,再次点击启动app,称为 热启动。 特点:未清理后台任务,再次启动 3为什么出现白屏 在一个Activity打开时,如果该Activity所属的Applica
蜻蜓队长
2018/08/03
1.5K0
App冷启动与启动白屏处理
❤️Android 性能优化之启动优化❤️
用户希望应用能够快速打开。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。轻则鄙视你,重则直接卸载你的应用。
Android 帅次
2021/11/12
9980
❤️Android 性能优化之启动优化❤️
启动优化
Dex文件用的到的类和安装包APK里面各种资源文件一般都比较小,但是读取非常频繁。
ruochen
2021/11/21
3.7K0
启动优化
启动优化、布局优化、内存优化、卡顿优化、网络优化、数据库优化、内存泄漏优化、包体积优化等等。
码上积木
2020/12/25
9780
相关推荐
5分钟教你打造一个秒开的 Android App
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验