人生几何?

iOS底层原理之启动优化(一):相关概念 & 优化方案

2021-09-14  本文已影响0人  iOS丶lant

前言

本文开始将对APP启动优化进行一个简单的探索,本文先介绍下启动相关的基本概念。
如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

一: 虚拟内存 & 物理内存

物理内存时代内存地址都是物理地址,数据的访问是直接通过物理内存地址访问的。这种方式会有两个问题:

  1. 内存不够用。

  2. 内存数据不安全。

针对上面的问题,科学家们提出了虚拟内存的设想,并通过虚拟地址和物理地址对应关系的映射表让虚拟内存的设想真正落地。解决了应用程序,数据,堆栈的总的大小受限于物理内存大小的限制。每个进程都有自己独立的虚拟内存,无法互相访问,也就保证了进程间数据的安全性。

虚拟内存与物理内存映射关系:

二:ASLR

上面虚拟内存解决了进程间数据安全的问题,但是由于每个进程的虚拟内存的起始地址和大小都是固定的,这就导致我们的数据非常容易被破解,相对应的数据安全又不存在了。为了解决这个问题,AppleiOS4.3内导入了ASLR

其目的是通过利用随机方式配置数据地址空间,使某些敏感数据(例如APP登录注册、支付相关代码)配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击。

由于ASLR的存在,导致可执行文件和动态链接库在虚拟内存中的加载地址每次启动都不固定,所以需要在启动时来修复镜像中的资源指针来指向正确的地址。即正确的内存地址 = ASLR地址 + 偏移值(offset)

三: 启动分类

启动的过程一般是指从用户点击app图标开始到application:didFinishLaunchingWithOptions:方法执行完成为止,根据场景的不同,启动可以分为两种:冷启动热启动

通过上面分类可知,需要进行优化的是冷启动

四: 启动阶段

iOSAPP启动以main函数为分隔点分为两个阶段:

五: 优化方案

5.1: pre-main阶段的优化方案

pre-main阶段的耗时其实就是dyld加载过程的耗时,在前文iOS底层原理之dyld应用程序加载中已经分析了dyld的加载流程。

针对pre-main阶段的耗时,苹果提供了内建的测量方法,在Edit Scheme -> Run -> Arguments -> Environment Variables添加DYLD_PRINT_STATISTICS的环境变量:

运行测试项目,会看到如下输出(空项目,所以耗时较少):

5.2: main函数之后阶段的优化

pre-main阶段的优化大都解决的是资源浪费的问题,都只能达到毫秒级的优化效果而已。启动时对于用户感知最明显的,真正需要做的,大多是main函数之后的业务逻辑的优化。

application:didFinishLaunchingWithOptions:中的业务主要分为三种类型:

main函数之后的优化方案:

总结

启动相关的概率和优化方案就简单介绍到这里,后续将针对pre-main阶段的二进制重排进行一个简单的探索。

文末推荐:iOS热门文集
- 面试基础
iOS面试基础知识 (一) https://github.com/iOS-Mayday/heji
iOS面试基础知识 (二) https://github.com/iOS-Mayday/heji
iOS面试基础知识 (三) https://github.com/iOS-Mayday/heji
iOS面试基础知识 (四) https://github.com/iOS-Mayday/heji
iOS面试基础知识 (五) https://github.com/iOS-Mayday/heji
- 知识详解
iOS面试要点之GCD面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之多线程面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之block面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之Runtime面试要 点https://github.com/iOS-Mayday/heji
iOS面试要点之RunLoop面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之内存管理面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之MVC、MVVM面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之网络性能优化要点 https://github.com/iOS-Mayday/heji
iOS面试要点之网络编程面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之KVC&KVO面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之数据存储面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之混编技术面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之设计模式面试要点 https://github.com/iOS-Mayday/heji
iOS面试要点之UI面试要点 https://github.com/iOS-Mayday/heji

上一篇 下一篇

猜你喜欢

热点阅读