App启动优化

app启动分为冷启动和热启动两种。所谓的冷启动和热启动主要取决于该app进程是否在系统中。我们主要考虑的是冷启动的优化,因为这才是一个完整的启动过程,热启动中我们能干涉的其实很少

  • main函数之前
    可以通过添加添加环境变量 DYLD_PRINT_STATISTICS 来查看main函数执行之前都做了什么,同时也可以看出对应消耗的时间。
    • main函数执行之前主要做了以下几种事情
Total pre-main time:  17.00 milliseconds (100.0%)
         dylib loading time: 140.89 milliseconds (828.5%)
        rebase/binding time: 126687488.7 seconds (247154424.8%)
            ObjC setup time:  16.27 milliseconds (95.7%)
           initializer time:  57.75 milliseconds (339.6%)
           slowest intializers :
             libSystem.B.dylib :   3.70 milliseconds (21.7%)
   libBacktraceRecording.dylib :   5.09 milliseconds (29.9%)
               libobjc.A.dylib :   1.01 milliseconds (5.9%)
                CoreFoundation :   1.24 milliseconds (7.3%)
                    Foundation :   0.35 milliseconds (2.1%)
    libMainThreadChecker.dylib :  43.83 milliseconds (257.7%)
        libLLVMContainer.dylib :   1.18 milliseconds (6.9%)
  • 1、动态库的加载
    对应的是dylib loading time可以看到其加载时间
    优化建议
    这里主要的优化建议是减少动态库的加载,苹果建议更少的使用动态库,如果动态库的数量较多的时候,尽量将多个动态库合并,数量上最多支持6个非系统动态库的合并

  • 2、偏移修正和符号绑定
    对应的是rebase/binding time

    • 偏移修正
      任何App生成的二进制文件中的方法、函数都会有个地址,而这个地址是相对于当前二进制文件中的偏移地址,但是到了运行时系统会随机生成一个数值添加到二进制文件的头部(ASLR安全机制下文中会有讲解),所以此时函数、方法的地址就是 随机分配的数值+偏移地址 这个过程就是偏移修正
    • 符号绑定
      动态库不像是静态库,静态库实在编译时期就将对应使用到的代码一起打包生成了mach-o文件,所以此时使用到的静态库的方法、函数其实就和自定义的方法、函数差不多了,能够直接获取到对应的地址,但是动态库在编译阶段是不会被打包进mach-o文件的,但是此时又用到了动态库中的方法,例如用到了NSLog方法,此时就会生成一个!NSLog 符号此时这个符号会随机指向一个地址,当运行时,此时动态库被加载到内存,此时就可以拿到动态库对应的方法、函数的地址,所以此时就需要将!NSLog这个符号绑定到相应的地址上去(dyld做的),这个过程就叫做符号绑定
  • 3、类的注册
    对应的是ObjC setup time
    优化建议
    删除启动后不会去使用的类

  • 4、执行load和构造函数
    对应的是initializer time
    优化建议
    减少使用load方法相应的可以将load中的实现放在+initialize()方法中去,因为一般一个load方法的执行需要耗时4毫秒,而且如果类中实现了load那么相对应类的加载就要提前到read_image方法中去执行,如果没有实现load类的加载则会方法第一次发送消息的时候加载,

  • main函数之后
    这个阶段主要是指main函数执行开始到首屏渲染完成方法执行完毕。
    这个阶段主要做的工作包括:

    1、第三方SDK初始化
    2、自定义工具类初始化
    3、首屏数据的加载
    4、首屏渲染的一些计算

优化建议
只处理首屏渲染相关的任务,其他非首屏的业务例如初始化、注册监听、配置文件的读取等等都放在首页渲染完成之后去做,当然也可以开辟一个线程去处理这些事情。尽量不要占用主线程
自己的业务逻辑的优化,已经废弃的不需要用的逻辑代码、方法、函数都删除掉,减少每个流程的耗时
启动时期的页面尽量避免使用xib、storyboard(中间会有个转换的过程也是需要耗时的)UI的主框架尽量使用纯代码

【参考】https://juejin.cn/post/6965495023924330504

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

推荐阅读更多精彩内容

  • 背景 一个项目做的时间长了,启动流程往往容易杂乱,库也用的越来越多,APP的启动时间也会慢慢变长。本次将针对iOS...
    lp_lp阅读 1,563评论 0 12
  • 前言 一般情况下,在App早期阶段,启动不会有明显的性能问题。启动性能问题也不是在某个版本突然出现的,而是随着版本...
    Longshihua阅读 2,364评论 1 11
  • 问题,APP启动慢,从启动到展示主页面视图需要5秒以上。 首先,研究APP启动流程。 优化方向,main函数之前和...
    小暖风阅读 1,388评论 0 1
  • 通过阅读这篇文章,我们将了解APP启动过程中都做了哪些事情。文章分为三部分,第一部分是原理讲解,第二部分是优化方案...
    CNWH阅读 904评论 0 4
  • iOS原理 文章汇总[https://www.jianshu.com/p/9fa8104e3698] 基本概念 A...
    东篱采桑人阅读 632评论 0 2