APP启动更快iOS15

之前可以通过设置DYLD_PRINT_STATISTICS = 1 变量在XCode上统计APP启动时间pre-main阶段,但是在XCode13.0 & iOS15之后,通过设置变量的方式在XCode上失效啦;

Instrument: App Launch & Time Profiler 取而代之

Xcode---> Product--->Profile进入到Instrument页面,选择App Launch(如下图:)

Instrument

双击后,进入到App Launch界面:(如下图)

App Launch

点击页面左上角红色按钮,注意选中真机,然后手机会自动启动APP,启动后停止运行

APP启动时间截图
详细步骤耗时

可以通过每个详细步骤的详情查看具体耗时情况(点击箭头可进入详情页)

可以根据分析数据针对项目情况进行相关步骤的优化

二进制重排

iOS15让应用启动更快

什么是dyld? 

Dynamic linker, 动态链接器是每个应用程序的入口,负责让代码准备运行好。所以对dyld的任何改动都会影响应用程序的启动时间。在调用main、运行静态初始化方法或者设置Objc运行时之前,dyld会进行fixups工作(包括rebase、bind操作)这些操作修改了应用程序二进制文件中的指针,以保证在运行时所有地址的有效性。

iOS15中唯一的变化是数据现在由linkedit_data_command引用,这个结构中包含了第一个节点的偏移量

链式补丁格式(chain fixups)

在iOS15之前,rebase、bind和lazy bind各自存储在一个单独的表中。现在被合并成一个链,链的起点指针包含在这个新的加载命令中

应用程序的二进制文件文件被分成几个部分,每个部分都包含一连串的fixups,这些fixups可以是bind或者rebase(不再有lazy binds)。二进制文件的每个64位rebase[3]位置现在编码它所指向的偏移量,以及下一个fixups的偏移量,结构如下:

struct dyld_chained_ptr_64_rebase

{

uint64_t      target : 36,    /*用于指针target*/

                     high8 : 8, 

                     reserved : 7, // 0s 

                     next : 12,    /*用于提供下一个fixup偏移量(stride=4)*/

                     bind : 1; // Always 0 for a rebase

};

这种非常紧凑的编码意味着遍历链的整个过程就可以覆盖整个二进制文件。在作者的测试中,超过50%的dyld都能够被新的格式系统所优化并最终减少二进制包的大小,只有少量的元数据被保留下来以引导每个page的第一次fixup

重点顺序问题

理解fixup格式背后的动机,必须了解应用程序最昂贵的操作之一:page fault。当应用程序启动过程中访问文件系统中的代码时,需要通过一个page fault将其从磁盘文件中带入内存。应用程序二进制文件中的每个16kb范围都被映射到内存中的一个页面。一旦页面被修改,只要应用程序不停止,它就需要留在RAM中(dirty page)。iOS通过压缩最近没有使用的页面来优化dirty page.

应用程序启动时的fixup需要改变应用程序二进制中的地址,因此整个page都不可避免被标记为dirty。

当使用表结构存储fixup数据时,首先要解决rebase,然后是bind。这意味着rebase需要很多page fault,并且大部分是IO绑定[4]。另一方面,bind所访问的page是rebase所使用的page的30%。

在iOS15中,链式fixup将每个内存page的所有变化合并在一起。Dyld现在可以更快地处理它,只需调整一次内存,就可以同时完成rebase和bind。这使得像内存压缩器这样的操作系统功能可以利用链式fixups中的信息,不需要在bind过程中回去解压旧page。这些变化,那么dyld中的rebase功能变成了一个无用的功能。

虽然这一变化只在以iOS15为目标是生效,但仍可以做很多事情来优化应用程序的启动时间。

Reduce number of dynamic frameworks  减少动态框架数量

Reduce app size so less memory pages are used 减少应用程序的大小,以减少内存也的使用

Move code out of +load and static initializers 移出+load和静态初始化中的代码

Use fewer classes    使用更少的类

Defer work to after drawing the first frame 延迟工作到第一帧绘制之后

以上部分是将上面链接中的部分进行了翻译,感兴趣看完整版,可直接看链接

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

推荐阅读更多精彩内容

  • 背景 一个项目做的时间长了,启动流程往往容易杂乱,库也用的越来越多,APP 的启动时间也会慢慢变长。本次将针对 i...
    Yealink阅读 722评论 0 0
  • 对于iOS App的首次启动优化,主要关注两个点,一个是main之前的耗时,一个就是main函数到root VC ...
    jayhe阅读 7,019评论 7 32
  • 我们都知道 APP 启动时长对保证用户粘性有很大影响,一款加载时长过长的应该可能会直接被用户放弃,那么 APP启动...
    奚山遇白阅读 7,830评论 4 20
  • 在用户打开App的时候,过长的等待时间会使用户陷入等待焦虑,对用户留存率产生不良影响,虽然精致的启动页能对等待焦虑...
    Don_He阅读 1,779评论 0 0
  • 背景 99u在去年做过一次加快启动时间的优化,虽然是工厂大大们在主导,但是一直很好奇当我们的手指在屏幕上点击一个a...
    d8893ea8ba05阅读 3,325评论 2 11