大拇指知识分享!欢迎光临!
我们一直在努力!

app启动流程分析(个人开发app最简单方法)

前言

今天来讲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的启动大致分为几个部分:

  1. 内核将App的执行文件加载到随机地址空间(加载到随机地址主要是因为ASLR技术)
  2. 内核将dyld的执行文件加载到随机地址空间
  3. 内核执行dyld文件
  4. dyld启动App
  • dyld加载所有App所依赖的dylibs(动态库)
  • 执行rebasing/binding修复地址
  • Objc Setup
  • initialize
  1. 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之后

83063c9aa90b402bbb7485bcd5594b60noop.image_

View加载优化

有时候ViewDidLoad里面会进行很多耗时操作,用户还是会感觉到卡顿; 关于这点,目前的比较好的方案是首先给用户提供一个空壳,或者一个页面大概内容的图片,然后在ViewDidLoad方法里面进行数据加载和解析渲染等一系列操作

这样一来,用户已经看到界面了,就不会觉得启动慢了,相当于把启动时间转嫁给数据请求时间去背锅了。如果再配合上之前数据的缓存,那么这个启动的效果就会比较可观了

五、总结

启动优化需要针对不同的业务做出不同的优化方式

总的来说,优化方向可以分为布局优化,减少解析xml和绘制的时间;逻辑优化,将必要且耗时的操作异步加载,将非必要的采用延时加载,另外,将操作优先级高的可以优先加载;由于篇幅的原因,这些内容我们下节在讲

启动速度优化是一个大工程,后续还需要针对具体场景继续深度挖掘

以上就是今天的所有内容,相信大家看完之后都会有着自己的收获,但是盲目的学习并不能让你的技术稳定的增长

赞(0)
未经允许不得转载:大拇指知识 » app启动流程分析(个人开发app最简单方法)
分享到: 更多 (0)

评论 抢沙发

1 + 2 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

大拇指知识!

联系我们联系我们