iOS启动优化笔记

306 阅读3分钟

参考文章链接:

网易云音乐:segmentfault.com/a/119000004…

抖音:blog.csdn.net/ByteDanceTe…
美团:tech.meituan.com/2018/12/06/…

启动的定义

app的启动分为冷启动和热启动,然而各自的定义在iOS13前后有不一样的定义。iOS13是一个分水岭,主要原因是iOS13引入了dyld3. dyld3增加了启动闭包的概念(一种启动时的缓存技术/策略)

iOS13以前

冷启动:App点击启动前,系统中不存在进程,点击App后,系统给App创建进程并且启动 热启动:App在冷启动后用户将App退回后台(suspend状态),App进程还在系统之中,用户点击App重新返回App的过程。

iOS13及之后

冷启动:重启手机系统后,系统中没有任何App进程的缓存信息,用户点击App,系统给App创建进程启动 热启动:用户把App进程杀死,系统中存在App进程缓存信息,用户点击App,系统给App创建进程启动 回前台:App在启动后用户将App退回后台,App进程还在系统之中,用户点击App重新返回App的过程 iOS启动流程分析与优化

可以参考如下文章:

二进制重排:blog.csdn.net/kangpengpen…

美团冷启动优化:tech.meituan.com/2018/12/06/…

启动流程和优化详解:juejin.cn/post/695159…

二进制重排实践:github.com/lyandy/Link…

dylb详解:www.dllhook.com/post/238.ht…

1.启动的定义是什么

2.介绍一下启动流程涉及的步骤

3.启动过程中的关键步骤的详细说明

4.基于main之前的优化

5.基于main函数之后的优化

6.项目借鉴之处

二进制重排的原理:

我们的 App包数据并不是在启动的时候一次全部加载到内存中的,而是类似于懒加载的方式,以每页16KB的数据进行分页加载。启动的时刻,也是缺页加载次数最多的时刻。因为启动用到的类和方法,并不是全部集中在某几页数据中,而是根据编译顺序,分散到不确定的分页数据中。我们做二进制重拍,也就是要让启动用到的函数,集中到最前边的几张表中,减少分页加载的次数,也就节约了启动时间。

那么为什么减少分页加载的次数,可以节省启动时间呢?

这是应为,每页数据加载到内存中,还需要进行重绑定的过程,因为ASLR(地址空间布局随机化),每次启动后指针地址值并不是MachO中编译后的地址,还需要加上这个随机偏移地址,也就是rebase(重绑定)的过程。

启动时刻加载的分页越多,重绑定的地址也就越多,拖慢了应用的启动时间。

问题:

1.怎么得到内存页的数量(system trace工具、对比order和linkmap进行大概的计算)

2.怎么计算出来各个阶段消耗的时间

3.linkmap能统计出来pod里面的方法调用么

代码瘦身:

去掉无用类和无用的方法