iOS--App启动过程及优化

前言

        App启动是用户对于一个app的第一印象,因此如何使用户在最短的时间打开进入app显得格外重要。启动优化因此成为了App调优至关重要的一项。

        只有具体了解了App的启动过程,我们才能对其进行优化。

App启动过程

App启动分为冷启动和热启动

  • 热启动:App刚结束后再启动,有部分在内存但没有进程存在。
  • 冷启动:启动时,App的进程不在系统里,需要开启新进程。

我们所做的优化都是针对于冷启动,即app第一次启动或是kill掉之后重新打开,不在内存里也没有进程存在。

APP冷启动可以概括为三个阶段

  • 1、dyld:加载镜像,动态库
  • 2、RunTime方法
  • 3、main函数初始化

1、dyld

dyld(dynamic link editor),app的动态链接器,可以用来装在Mach-O文件(可执行文件、动态库等)

启动APP时,dyld所做的事情有

真正的加载过程从exec()函数开始,exec()是一个系统调用。操作系统首先为进程分配一段内存空间,然后执行如下操作:

  • 1、把App对应的可执行文件加载到内存。
  • 2、把Dyld加载到内存。
  • 3、Dyld进行动态链接。

具体内容

  • 1、加载动态库
    • Dyld从主执行文件的header获取到需要加载的所依赖动态库列表,然后它需要找到每个 dylib,而应用所依赖的 dylib 文件可能会再依赖其他 dylib,所以所需要加载的是动态库列表一个递归依赖的集合
  • 2、Rebase和Bind
    • 1、Rebase在Image内部调整指针的指向。在过去,会把动态库加载到指定地址,所有指针和数据对于代码都是对的,而现在地址空间布局是随机化,所以需要在原来的地址根据随机的偏移量做一下修正
    • 2、Bind是把指针正确地指向Image外部的内容。这些指向外部的指针被符号(symbol)名称绑定,dyld需要去符号表里查找,找到symbol对应的实现

2、RunTime方法

在Dyld阶段加载结束以后就进入了RunTime阶段

  • 1、Objc setup
    • 1、注册Objc类 (class registration)
    • 2、把category的定义插入方法列表 (category registration)
    • 3、保证每一个selector唯一 (selector uniquing)
  • 2、Initializers
    • 1、Objc的+load()函数
    • 2、C++的构造函数属性函数
    • 3、非基本类型的C++静态全局变量的创建(通常是类或结构体)

3、main函数初始化

APP的启动由dyld主导,将可执行文件加载到内存,顺便加载所有依赖的动态库 并由runtime负责加载成objc定义的结构 所有初始化工作结束后,dyld就会调用main函数 接下来就是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法

这个里面往往是最占用启动时间的地方,同时也是我们最为可控的地方。

• 进入 main() 函数,启动应用。

• 执行 UIApplicationMain() 函数,创建 UIApplication 对象并设置 AppDelegate。

• 加载应用的主 UI,包括 storyboard 或 xib 文件,以及 AppDelegate 的各种生命周期方法,如 application:didFinishLaunchingWithOptions:。

4.首屏渲染阶段

• 初始化 rootViewController,加载和渲染界面。

• 渲染完成后,用户将看到应用的首屏。

总结:iOS App冷启动的流程分为以下四步:

1. dyld 加载阶段:

• 动态链接器 dyld 负责加载应用的可执行文件及其依赖的动态库。此时,系统将会做如下工作:

• 查找应用的可执行文件和动态库

• 将它们加载到内存中

• 进行符号解析和绑定

• 执行初始化函数(如 +load 方法和静态构造函数)

2. runtime 初始化阶段:

• ObjC 运行时对类和分类进行注册。

• 执行各类 +load 方法,这个阶段还会进行一些 Swift 类的初始化。

3. main() 函数执行阶段:

• 进入 main() 函数,启动应用。

• 执行 UIApplicationMain() 函数,创建 UIApplication 对象并设置 AppDelegate。

• 加载应用的主 UI,包括 storyboard 或 xib 文件,以及 AppDelegate 的各种生命周期方法,如 application:didFinishLaunchingWithOptions:。

4. 首屏渲染阶段:

• 初始化 rootViewController,加载和渲染界面。

• 渲染完成后,用户将看到应用的首屏。

冷启动时间优化

1. 减少动态库的数量

动态库越多,dyld 加载的时间越长。

2. 延迟初始化

尽量延迟一些不必要的初始化工作,不要在启动时立即初始化所有对象。可以使用懒加载将一些初始化放到用户需要时再进行,以减轻启动阶段的负担。

3. 避免 +load 方法的使用

+load 方法会在 dyld 加载阶段执行,建议用 +initialize 或者在合适的地方延迟执行初始化逻辑,避免阻塞启动流程。

4.优化 AppDelegate:

application:didFinishLaunchingWithOptions: 方法应保持精简,避免在这里进行耗时的操作。将一些耗时任务放到后台队列中异步执行。

5.减少主线程阻塞

启动阶段尽量避免主线程的耗时操作,如文件 I/O、网络请求等。将这些操作放到子线程处理,以免阻塞界面渲染。

6.预编译和瘦身

移除未使用的代码、图片等资源,精简应用的体积,从而减少加载时间。

尽量减少 storyboard 的使用,尤其是大而复杂的 storyboard,可以分解成多个小的 storyboard 或者使用纯代码实现界面。

7.启动时的网络请求

尽量避免在启动时进行同步的网络请求,如果必须请求,可以在启动完成后或在后台进行异步请求,以减少对启动时间的影响。

参考:

https://github.com/SunshineBrother/JHBlog/blob/master/iOS%E7%9F%A5%E8%AF%86%E7%82%B9/iOS%E5%A4%A7%E6%9D%82%E7%83%A9/APP%E5%90%AF%E5%8A%A8%E4%BC%98%E5%8C%96/App%E5%90%AF%E5%8A%A8%E6%97%B6%E9%97%B4%E4%BC%98%E5%8C%96.md

IOS App冷启动优化_ios冷启动优化-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/435820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术?二、项目内容1.整体介绍(示范)2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,记账本小…

臀部筋膜炎吃什么药最有效

臀部筋膜炎患者大多数会出现疼痛的症状,且疼痛程度可能会随着病情的加重而不断加重。疼痛可能表现为持续性或间歇性,严重时甚至可能出现针扎样疼痛。在疼痛的同时,如果按压臀部局部,可能会导致疼痛症状加剧。由于炎症刺激&#xf…

WPS在表格中填写材料时,内容过多导致表格不换页,其余内容无法正常显示 以及 内容过多,导致表格换页——解决方法

一、现象 1,内容过多导致表格不换页,其余内容无法正常显示 2,内容过多,导致表格换页 二、解决方法 在表格内右击,选择表格属性 在菜单栏选择行,勾选允许跨页断行,点击确定即可 1&#xff0…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】 一、TFLM是什么?二、TFLM开源项目2.1 下载TFLM源代码2.2 TFLM基准测试说明2.3 TFLM基准测试命令 三、TFLM初步体验3.1 PC上运行Keyword基准测试3.2 PC上运行Person detection基准测试3.3 No module nam…

Redis篇(缓存机制 - 分布式缓存)(持续更新迭代)

目录 一、单点 Redis 的问题 1. 数据丢失问题 2. 并发能力问题 3. 故障恢复问题 4. 存储能力问题 5. 四种问题的解决方案 二、Redis持久化(两种方案) 1. RDB持久化 1.1. 简介 1.2. 执行时机 save命令 bgsave命令 停机时 触发RDB条件 1.3. …

phpstudy简易使用

注意,本文所述的操作步骤均建立在电脑上已经完成php环境变量的配置与vscode的安装之上 、

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规…

网络安全法中,个人信息保护的措施和原则有哪些?

《中华人民共和国网络安全法》中关于个人信息保护的规定强调了几项基本原则和措施,以确保个人信息的安全。以下是其中的一些要点: 原则 合法性:个人信息的收集和使用必须符合法律规定。 正当性:信息收集和使用的目的是正当的&…

算法葫芦书(笔试面试)

一、特征工程 1.特征归一化:所有特征统一到一个区间内 线性函数归一化(0到1区间)、零均值归一化(均值0,标准差1) 2.类比型特征->数值性特征 序号编码、独热编码、二进制编码(010&#xf…

数学建模--什么是数学建模?数学建模应该怎么准备?

前言 这是去年底学数学建模老哥的建模课程笔记;未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下;提示:数学建模只有实战才能提升,光学算法没有啥意义,也很难学的很懂。 文章目录…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(2)

MQTT_TX设备为发送数据的Topic,使用MQTT-fx软件实现 MQTT_RX设备为接收(订阅)数据的Topic,使用ESP8266通过AT指令实现 一、使用MQTT-fx实现发送数据 首先进入控制台,获取发送设备 “ MQTT_TX ” 的MQTT连接参数,具体具体操作如…

【Redis入门到精通五】Java如何像使用MySQL一样使用Redis(jedis安装及使用)

目录 Jedis 1.jedis是什么 2.jedis的安装配置 3.jedis的基础命令操作展示 1.set和get操作: 2.exists和del操作: 3.keys和type操作: 4. expire和ttl: Jedis Java 操作 redis 的客⼾端有很多,其中最知名的是 jedi…

Mysql 存储过程

1.需求: users表中的数据 如果在users_copy1表中存在(2各表id相等),则根据users表的数据更新users_copy1表的数据,这两个表id相等。 例子: users表数据: users_copy1表数据: 当执…

docker运行arm64架构的镜像、不同平台镜像构建

背景 Docker 允许开发者将应用及其依赖打包成一个轻量级、可移植的容器,实现“一次构建,到处运行”的目标。然而,不同的操作系统和硬件架构对容器镜像有不同的要求。例如,Linux 和 Windows 系统有不同的文件系统和系统调用&#…

单臂路由详解

目录 单臂路由概念 单臂路由实验 路由器配置 交换机配置 实验验证 基于Eth-Trunk的单臂路由 路由器配置 交换机配置 实验验证 单臂路由概念 单臂路由技术能让路由器的一个物理接口对应不同VLAN数据的实质是把物理接口分成若干个子接口,这些子接口通过封装…

需求5:增加一个按钮

在之前的几个需求中,我们逐步从修改字段到新增字段,按部就班地完成了相关工作。通过最近的文章,不难看出我目前正在处理前端的“未完成”和“已完成”按钮。借此机会,我决定趁热打铁,重新梳理一下之前关于按钮实现的需…

【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

计算机视觉领域顶级会议 European Conference on Computer Vision(ECCV 2024)将于9月29日至10月4日在意大利米兰召开,快手音视频技术部联合清华大学所发表的题为《XPSR: Cross-modal Priors for Diffusion-based Image Super-Resolution》——…

Visual Studio Code下载安装及汉化

官网:https://code.visualstudio.com/ 按照指示一步步操作即可: 汉化:

②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 (接上一章) 自由协议通信步骤 (以MS-A2-1041为例) 接收与…