当前位置:网站首页>浅谈性能优化:APP的启动流程分析与优化
浅谈性能优化:APP的启动流程分析与优化
2022-08-02 03:27:00 【Android技术栈】
前言
今天来讲APP性能优化的第一步,也是用户接触最直接的一步: 冷启动优化; 主要从以下几个问题来入手
什么是冷启动?什么是热启动?
冷启动的过程中,系统都做了什么
pre-main过程该如何优化?
T3过程该如何优化?
什么是冷启动?什么是热启动?
冷启动: 在APP点击启动前,他的进程不在系统中,需要系统新创建一个进程分配给它,并进行启动的情况; 冷启动是一次完整的启动过程
相对的 热启动: 按下home键的时候,app还存在一段时间,这时点击app马上就能恢复到原状态; 这种启动我们称为热启动
APP的启动时间,是指从用户点击APP开始,到用户看到第一个界面之间的时间;总的来说,APP启动主要包括三个阶段:
1.T1: main()函数执行前:pre-main
2.T2: main()函数执行后至didFinishLaunch:behind-main
3.T3: didFinishLaunch至首屏渲染完成
冷启动的过程中,系统都做了什么?
dyld是App的启动器,启动的大部分事情都由dyld完成,iOS的启动大致分为几个部分:
内核将App的执行文件加载到随机地址空间(加载到随机地址主要是因为ASLR技术)
内核将dyld的执行文件加载到随机地址空间
内核执行dyld文件
dyld启动App
- dyld加载所有App所依赖的dylibs(动态库)
- 执行rebasing/binding修复地址
- Objc Setup
- initialize
- dyld调用App中的main(),将主动权交还给App
手机内核只负责将App的执行文件和dyld加载到内存中,然后所有的启动工作都交给了dyld
冷启动的优化工作主要都是在上面的第四步里做文章,第四步的具体工作可以看下面这张图

总结起来,pre-main()执行了如下操作
加载可执行文件(App的.o文件集合)
加载动态链接库,进行rebase指针调整和bind符号绑定
Objc运行时的初始处理,包括Objc相关类注册、category注册、selector唯一性检查等
初始化调用,包括了执行+load()方法、attribute((constructor))修饰的函数的调用、创建C++静态全局变量。
APP的启动优化
一个应用的性能如何,冷启动是个重要的衡量指标; 毕竟用户第一次使用应用时,多久能进入页面(包括首页、启动页、广告页等),是用户的第一感官
对于一般应用,有启动页和广告页,对启动速度的要求相对于来说降低了一些,毕竟,进来就是启动页,只是时间停留时间长短问题(当然,不是说对时间不敏感,你要是在启动页停留个3,5s,谁也受不了;不过,话说,谷歌统计的所有应用的平均时间竟然是4000多ms,这还是挺吃惊的)
我所做的是个系统工具类,没有启动页,直接就是干到首页。又因为是系统应用,要有和桌面有一体化的感觉,所以,对启动速度要求极高;同时,又由于要适配全机型(Android5.0 -Android 12.0),前期没有做版本区分,所以,挑战来说更大。无论怎么说吧,经过一轮又一轮的优化,低端机达到了550ms以内,高端机更是在300ms以内;整体启动速度提供65%左右
其实,现在写冷启动的并不多,为啥呢? 有一些是公司并不在意,个人也就不在意,还有就是业务有启动页,可能并不明显。最后也有一部分原因来讲就是应用层去优化有限,更多的是业务逻辑的优化,感觉写不出创意来,我这篇文章也是先简单讲下冷启动的流程,看下那些我们可以去做,以及一些通用通吃的方案,一些结合业务做的优化(图片的加载优化、耗时业务的巧妙处理),期望大家看到后引起更多的思考和更多的交流学习
App启动进程图述
在这个进程启动图中,只是节选了我们正常冷启动的四个进程间的唤起与创建,详细的描述了App进程的调用图,是为了让大家对流程优化有更清晰的认知。 有图可以知道,View的绘制是在生命周期的onResume之后

View加载优化
有时候ViewDidLoad里面会进行很多耗时操作,用户还是会感觉到卡顿; 关于这点,目前的比较好的方案是首先给用户提供一个空壳,或者一个页面大概内容的图片,然后在ViewDidLoad方法里面进行数据加载和解析渲染等一系列操作
这样一来,用户已经看到界面了,就不会觉得启动慢了,相当于把启动时间转嫁给数据请求时间去背锅了。如果再配合上之前数据的缓存,那么这个启动的效果就会比较可观了
五、总结
启动优化需要针对不同的业务做出不同的优化方式
总的来说,**优化方向可以分为布局优化,减少解析xml和绘制的时间;逻辑优化,将必要且耗时的操作异步加载,将非必要的采用延时加载,另外,将操作优先级高的可以优先加载;**由于篇幅的原因,这些内容我们下节在讲
启动速度优化是一个大工程,后续还需要针对具体场景继续深度挖掘
以上就是今天的所有内容,相信大家看完之后都会有着自己的收获,但是盲目的学习并不能让你的技术稳定的增长
我自荐一套 [《完整的Android学习资料,以及一些视频课讲解》
现在私信发送 “笔记” 或 “进阶” 即可 免费获取


最后我想说:
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉
边栏推荐
猜你喜欢
随机推荐
php的curl函数模拟post数据提交,速度非常慢
CTF入门笔记之ping
web安全之目录遍历
hackmyvm-bunny预排
laravel 写api接口时 session获取不到处理办法
ES6 three-dot operator, array method, string extension method
The focus of the Dom implementation input triggers
CTF-Neting Cup Past Topics
(2) Sequence structures, Boolean values of objects, selection structures, loop structures, lists, dictionaries, tuples, sets
How to determine the direction based on two coordinate points on the map
加密数字货币前传:从大卫·乔姆到中本聪
PHP反序列化漏洞
强化学习笔记:DDPG
By figure, a (complete code at the end)
VIKINGS: 1 vulnhub walkthrough
【一句话攻略】彻底理解JS中的回调(Callback)函数
一分钟get:缓存穿透、缓存击穿、缓存雪崩
centos8 安装搭建php环境
一个网络安全小白鼠的学习之路—nmap高级用法之脚本使用
会计凭证概述、原始凭证、原始凭证的种类、原始凭证的基本内容、原始凭证的填制要求、原始凭证的审核









