iOS启动流程

关于mach-o

mach-O文件为Mach Object文件格式的缩写,它是一种用于可执行文件,目标代码,动态库,内核转储的文件格式。
常见的有以下形式:

  • Executable 可执行文件
  • Dylib动态库和Framework动态库,对应头文件和资源文件集合

Apple可执行文件格式几乎都是mach-o;

关于更多mach-o ,可参考Mac OS X ABI Mach-O File Format Reference

关于mach-o数据结构,可参考Mac本地路径下的/usr/include/mach-o源码。

为了直观看出mach-o相关信息,可以使用三方工具MachOView

MachOView下载

编译好的工程很老了,建议下载源码自己运行使用。

MachOView源码地址

关于安装源码启动报错,可参看别人已经写好的说明,我这边就不多说了。

mach-o文件分析工具 MachOview探究

这里我用MachOView工具打开了我本地的一个动态库。如图:

mach-o.jpg

关于 dyld

dyld(the dynamic link editor)是苹果的动态链接器,在系统内核做好程序准备工作之后,交由dyld负责余下的工作。它代码是开源的。源码地址
在App启动时它就负责加载mach-o文件。
关于 dyld详细解析说明,可参考dyld详解

App 具体启动流程

App启动一般分两种冷启动和热启动:

  • 冷启动是指, App 点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的情况。这是一次完整的启动过程。

  • 热启动是指 ,App 在冷启动后用户将 App 退后台,在App 的进程还在系统缓存的情况下,用户重新启动进入 App。

这里我们说的主要是冷启动。

App启动主要包括三个阶段:

1: main()函数执行前

这里就主要是dyld加载mach-o文件了

加载步骤主要分以下几步:

  • 设置运行环境

主要设置运行参数,环境变量之类的。可以再xcode的 Product->Scheme -> EditScheme,配置环境变量DYLD_PRINT_OPTSDYLD_PRINT_ENV,通过xcode打印dyld加载各种运行参数和环境变量。

  • 加载共享缓存

    如果共享缓存已加载就不在额外处理。

  • 加载可执行文件

    主程序的Mach-O加载进内存,并实例化一个ImageLoader
    ImageLoader是抽象类,其子类负责把Mach-O文件实例化。

  • 加载动态库

    会先从共享缓存中搜索

  • 链接主程序,进行 rebase 指针调整

    将实例化后的主程序进行动态修正,让二进制变为可正常执行的状态。
    Rebase 修正内部(指向当前mach-o文件)的指针指向.

  • Bind 修正外部指针指向
    包括链接插入的动态库,执行弱符号绑定。

  • 运行时Runtime 初始化

    相关类注册,分类注册,方法唯一性检查.
    我们可以通过先加符号断点 断在_objc_init,就可清晰看到dyld执行到runtime初始化
    之前的调用了。



    我们可以看到:
    栈底的dyldbootstrap::start()方法,继而调用了dyld::_main()方法,再到ImageLoader,再到objc_init

  • 其他必要的初始化

    • +load方法,
    • C/C++静态初始化对象和标记为attribute(constructor)的方法

2:main()函数执行后

从main()函数执行开始,到appDelegate 的 didFinishLaunchion里首屏渲染相关方法执行完成。

3:首屏渲染完成之后

其他业务模块相关代码初始化,文件处理,业务监听等等。

App启动时间优化

在Xcode中,可以通过设置环境变量来查看App的启动时间,DYLD_PRINT_STATISTICSDYLD_PRINT_STATISTICS_DETAILS

通过了解App启动流程,我们可以做以下优化

main()函数执行前:

  • 减少动态库数量,可以合并动态库

  • 减少无用的方法和类,合并分类

  • 减少 在load方法,试着用Initialize替代

  • 减少atribute((constructor))的使用,控制全局变量数量

main()函数之后:

对业务进行模块化处理,非首屏渲染业务应当尽量放到首屏渲染之后处理。

参考:

iOS 程序 main 函数之前发生了什么

App启动流程

iOS程序启动->dyld加载->runtime初始化(初识)

dyld详解

戴铭大神的 App 启动速度怎么做优化与监控

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容