iOS面试-app启动过程/优化启动时间

  1. 当我们点击应用图标,操作系统会为我们分配一个进程
  2. 然后调用dyld(动态连接库) 接管后续的工作;
  3. 加载可执行文件
    这一步dyld将二进制文件加载到运行内存,主要分三个步骤:
    • 检验二进制文件是否合法,是否符合当前cpu的架构,例如iOS系统是arm64/arm7,mac osx 是 i38u/x86_64
    • 选择使用dyld加载可执行文件;
    • 注册对应的镜像
  4. 链接过程主要分为两步:
    • 首先递归加载程序依赖的动态链接库;
    • 执行指针矫正:
      注意: 在链接过程会进行指针矫正,原因因为可执行文件在进行内存分配的时候是随机布局分配,即ASLR问题,时机分配布局的地址与原来的地址分布有差异,所以要进行指针矫正;指针错乱主要分为两种: 1. 执行可执行文件的指针,对于此类指针的修复,调用rebaase函数进行修复, 2. 从当前可执行文件的发出指向其他镜像可执行文件的指针,调用bind函数进行修复;
  5. 在bind修复完指针指向的问题后,开始进行objc-setup阶段,也就是oc-runtime初始化阶段,这个阶段主要将class/protocol/selector/imp加载到内存;
  6. 完成oc-runtime阶段的初始化后,就可以对业务代码就行初始化,首先初始化业务代码依赖的第三方库或者sdk,然后初始化自己,完成后该可执行文件就可以调用main函数啦,到此也就完成了app启动的过程。

app启动优化:

  1. 我们可以借助以下instrument 的time_profile在检测程序的启动时间;一般400ms以内最佳;

优化的方向分两个阶段:
一、优化过程1: pre-main,即main函数执行之前,优化如下:

  1. 尽量删除一些不必要的系统文件和第三方库;
  2. 尽量删除一些不必要的.h .m 文件;
  3. 尽量不要在类的load函数放入大量初始化信息,这样会延迟加载时间;
    二、 优化过程2: didfinishlauch函数到第一个主界面加载显示阶段,优化如下:
  4. 减少不必要的网络请求
    2.较少不必要的数据初始化操作,尽量写成懒加载
  5. 减少一些第三方sdk的初始化和版本检测相关代码
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一个项目做的时间长了,启动流程往往容易杂乱,库也用的越来越多,APP的启动时间也会慢慢变长。本次将针对iOS...
    酱油瓶2阅读 3,537评论 0 12
  • 背景知识: mach-o文件为基于Mach核心的操作系统的可执行文件、目标代码或动态库,是.out的代替,其提供了...
    Neo_joke阅读 3,804评论 0 46
  • 背景 99u在去年做过一次加快启动时间的优化,虽然是工厂大大们在主导,但是一直很好奇当我们的手指在屏幕上点击一个a...
    d8893ea8ba05阅读 3,440评论 2 11
  • 开头 在MacOS和iOS上,可执行程序的启动依赖于xnu内核进程运作和动态链接加载器dyld。其中后者的执行时长...
    RemisKrlet阅读 4,187评论 2 6
  • 约了晴晴一家人去普吉岛玩,第一天两个小家伙见面开始嗨,玩得不亦乐乎,就连酒店的浴缸都能让两人乐得呵呵呵。 第二天租...
    木樨木阅读 147评论 0 1