《理论篇》

《关于APP启动篇(含优化启动时间)--学习笔记》

2019-03-28  本文已影响0人  不够果断是种癌

本文为学习笔记,仅供自我学习。参考极客时间戴铭的《iOS开发高手课》

APP启动分为两种启动,一种热启动,一种冷启动。

冷启动:APP在点击和启动之前,它的进程不在系统里。需要系统新创建一个进程分配给它启动。(启动的完整过程)。

热启动:APP在冷启动后用户将APP退后台,在APP的进程还在系统的情况下。用户重新进入APP的过程。这个时候APP做的事情非常少。也就是applicationWillEnterForeground 用户即将进入后台。applicationDidBecomeActive 用户即将进入前台。

冷启动主要分为三个阶段

01.main()函数执行前

02.main  ()  函数执行后

03.首屏渲染完成后  

首先我们看看第一阶段,也就是main()函数执行前。

01.加载可执行文件(app所有.O文件的集合)。

02.加载动态链接库(dylb),进行rebase指针调整何bind符号绑定。rebase:使所有动态库被加载到随机的地址上,遍历所有内部指针,然后为他们添加一个地址偏移量。bind:针对那些指向动态库之外的指针,这些指针通过名称绑定。运行时,dylb通过符号名找到实现该符号的位置,主要是遍历查找符号表,当找到时把值存到该数据指针中。

03.Objc运行时的初始化处理,包括Objc相关类的注册,category注册,selector唯一性的检查等。初始化运行时通过类名把类实例化,所以在运行时,objc需要维护一张包含所有类与其映射等表格。每个加载类时,在这个全局表格中注册类名。在运行时还会把定义的Category插入方法列表中。Selector对于ObjC时唯一的。

04.初始化,包括了执行+load()方法,attribute((constructor))修饰的函数的调研,创建C++静态全局变量。对于动态库的初始化时从下由上去初始化。有些动态库的依赖时下层依赖上层的。

如何提升APP打开时间?

01.减少动态库加载。

02.减少加载启动后不会去使用的类或者方法。

03.控制c++全局变量的数量。

04.+load()方法里的内容可以放到首屏渲染完成后进行再执行,或使用 +initialize() 方法替换掉。

因为在一个+load()方法里,进行运行时方法替换操作会带来4毫秒的消耗。积少成多。

接下来我们再看看main函数执行后

这个阶段主要指从 main() 函数执行开始,到 appDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成。

首页的业务代码都是要在这个阶段,也就是首屏渲染前完成的,主要为以下3个:

01.首屏初始化所需的配置文件的读写操作;

02.首屏列表大数据的读取;

03.首屏渲染的大量计算;

首屏渲染后的这个阶段,主要完成的事,非首屏其他业务服务模块的初始化,监听的注册,和配置文件的读取等。从函数上来看,这个阶段指的就是截止到didFinishLaunchingWithOptions方法作用域内执行首屏渲染之后的所有方法执行完成。

首先在这里我们需要区分的是哪个是需要在app启动的时候搞定,哪个是需要在首屏渲染的时候搞定的。从而优化启动时间。优化可以分为以下几个方面。

01.功能级别的启动优化

思路 :main()函数开始执行后到首屏渲染完成前只处理首屏的相关的业务,其他非首屏业务的初始化,监听注册,配置文件读取等放在首屏渲染完成后去做。

02.方法级别的启动优化

定时抓取诸现场上面方法调用堆栈,计算一段时间各个方法的耗时。或者对objc_msgSend方法进行hook来掌握所有方法对执行耗时。

hooc方法对意思是,在原方法开始执行时换成执行其他你要指定的方法,或者在原油的方法执行前后执行你指定的方法。

上一篇 下一篇

猜你喜欢

热点阅读