iOS的启动优化

news2025/2/3 4:02:08

应用的启动优化

当我们参与到大型应用的时候 会遇到一些启动时间过长的情况 这时候就需要使用到相关的操作。
总结来说,main()方法调用前,启动过程大体分为如下步骤:
先是LLVM把项目翻译成IR文件然后到backend,PRE_MAIN,main。

1、内核加载可执行文件

2、load dylibs image (加载程序所需的动态库镜像文件)

3、Rebase image /  Bind image (由于ASLR(address space layout randomization)的存在,可执行文件和动态链接库在虚拟内  存中的加载地址每次启动都不固定,所以需要修复镜像中的资源指针)

4、Objc setup (注册Objc类、将Category中的方法插入方法列表)

5、initializers (调用Objc类的+load()方法、调用C++类的构造函数)

·针对APP启动时间的优化还是很有必要的。

   关于APP启动时间的分析和优化可以以main()为分界点,分为main()方法执行之前的加载时间(pre-main time)和main()之后的加载时间。那么,如何定量的测量这两个阶段具体的执行时间呢,下面先给出测量方法,看一下自己项目启动时间是否合理:

在Xcode中添加环境变量参数DYLD_PRINT_STATISTICS即可,这样运行APP时在控制台就会打印出pre-main花费的时间
如果想打印详细的pre-main中各个过程花费的时间,可以再添加一个DYLD_PRINT_STATISTICS_DETAILS参数pre-main time和total time的值不一样,其实下边的total time - debugger pause time就和上边的pre-main time大
(PS:因为iOS13之后就失效了,这两个属性所以使用时需要使用一个iOS13以下的模拟器)

如果你想打印dyld装载动态库的顺序,可以设置这个环境变量 DYLD_PRINT_LIBRARIES。
图:
在这里插入图片描述
在这里插入图片描述

请添加图片描述

main()方法调用之前启动过程的解析:

App开始启动后,系统内核(XNU)首先加载可执行文件(自身App的所有.o文件的集合),然后加载动态链接器dyld,dyld是一个专门用来加载动态链接库的库。 执行从dyld开始,dyld从可执行文件的依赖开始, 递归加载所有的依赖动态链接库。

(补充:用户点击图标之后,会发送一个系统调用 execve 到内核,内核创建进程。接着会把主二进制 mmap 进来,读取 load command 中的 LC_LOAD_DYLINKER,找到 dyld 的的路径。然后 mmap dyld 到虚拟内存,找到 dyld 的入口函数_dyld_start(最终调到dyld的_main函数),把 PC 寄存器设置成_dyld_start,接下来启动流程交给了 dyld。)

动态链接库包括:iOS 中用到的所有系统 framework,加载OC runtime方法的libobjc,系统级别的libSystem,例如libdispatch(GCD)和libsystem_blocks (Block)。

优化动作

1、减少动态库的引用,将项目中不使用的Framework及时删除,将Xcode配置中General -> Linked Frameworks and Libraries中使用不到的系统库不再引用。

2、合并动态库。

3、尽量不使用内嵌(embedded)的dylib,加载内嵌dylib性能开销较大。

4、清理项目中冗余的类、category。对于同一个类有多个category的,建议进行合并。

5、将不必须在+load方法中做的事情延迟到+initialize中。

6、尽量不要用C++虚函数(创建虚函数表有开销),不要在C++构造函数中做大量耗时操作。

查找项目中没有用到的类

下载工具fui ,link:https://github.com/dblock/fui

下载安装好工具以后
cd到工程目录下运行,$fui find ,然后就会打印出没有被使用的class

如何查找到没有被调用的函数

python FindSelectorsUnrefs.py -a {这里是工程中.app文件的地址在finder找到直接拖过来}

对应脚本FindSelectorsUnrefs.py可以在我上传的资源里面查找。

找到项目中没有被使用的图片资源

在我上传的资源文件中找到LSUnusedResources,的Mac应用跑起来然后把工程拖进去就可以了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

感冒咳嗽土法子

目录介绍 01.常见的感冒药02.止咳的土方法03.感冒的土方法 01.常见的感冒药 感冒是生活中最常见的疾病 患者往往会有:头昏、发烧、浑身酸痛、鼻塞、流鼻涕等症状 注意点 注意休息,适当补充水分,保持室内空气流通。 常见感冒药 主要成分的作…

CSS规范

CSS规范 命名规范 页面外围控制整体布局宽度:wrapper、页头:header、页面主体:main、内容:content、页脚:footer、导航:nav、主导航:mainbav、子导航:subnav、顶导航:t…

利用FormData上传本地文件

前言 最近接了个小项目,有个用客户端本地文件的需求。 正常这种需求都是前台传文件,后台去解析。 但这次C的老哥非让我给文件路径,说公司平台有解析文件的能力。 我说web不是桌面端,拿不到真实路径,他还不信&#…

已解决1. Downgrade the protobuf package to 3.20.x or lower.

已解决TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.1.0If you cannot immediately regenerate your protos, some other possible worka…

【Ctfer训练计划】——(二)

作者名:Demo不是emo 主页面链接:主页传送门创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

kubernetes管理应用配置之ConfigMap和Secret

目录 一、ConfigMap 二、Secret 一、ConfigMap 应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使得应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。 将应用打包为容器镜像后,可以通过环境变量或者外挂文…

【MySQL】3.MySQL表操作

文章目录1.0 MySQL表操作详解1.1 MySQL创建表1.2 MySQL查看表结构1.3 MySQL修改表1.0 MySQL表操作详解 1.1 MySQL创建表 指令:create table table_name(field1 datatype, field2 datatype) character collate engine; 后面三个参数可以省略,MySQL会自动调用默认…

开源绘图神器,Labplot的初步使用

文章目录数据生成图像定制多图绘制Labplot是一款开源且免费的科学绘图软件,除了Windows外,对Linux的Debian、Ubuntu、Fedora等发行版均有着良好的支持。 其下载地址为:LabPlot2下载,安装过程注意选择中文。 数据生成 打开软件后…

新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用Ethereum最新的ethersV5.0以上版本链接去…

XXL-JOB架构篇 - 初识分布式任务调度XXL-JOB

任务调度 一、什么时候需要任务调度? 基于时间的任务 批量数据的处理 异步解耦(比如先做任务A,再做任务B) 二、任务调度的基本需求有哪些? 可以定义触发的规则,比如基于时刻、时间间隔、表达式。 可以定义…

5G无线技术基础自学系列 | RF优化概述

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 随着5G商用网络的陆续建设,…

疫情抑制珠宝消费增长,珠宝主要市场需求萎缩

一、我国珠宝行业市场规模持续增长 根据观研报告网发布的《2022年中国珠宝行业分析报告-行业现状与发展趋势分析》显示,2021年上半年,中国金饰需求增长强劲,中国金饰消费量在2021年第二季度趋于稳定,使上半年金饰总需求达到338吨…

chatGPT接口,不需要科学上网就可以调用的OPENAI接口

最近很多国产版本的chatGPT出现了 查找了一圈发现调用的openai 的一个接口 测试了一下效果还算可以吧 视频教程 链接: 视频教程 用接口自己写了一个测试的网页 日常使用应该是不成问题 接口整理好了在这: 请求接口: URL:-POST https://api.openai.…

m基于RBF神经网络和BP神经网络的信道估计误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在无线通信系统中,从发射端发射的信号,经过直射、反射、散射等路径到达接收端。在ofdm系统中,为了获取更好的性能,需要进行信道估计获取信道的状态…

Diffusion Model合集 part1

扩散模型原理介绍1一,条件概率公式与高斯分布的KL散度重参数技巧二,VAE和多层VAE回顾单层VAE的原理公式与置信下界多层VAE的原理公式与置信下界三,Diffusion Model 图示四,扩散过程(Diffusion Process)与VAE的区别:如何…

腾讯云weda低代码让别人能看到发布的应用

我们先登录低代码的平台 腾讯云-控制台 (tencent.com) 我们从创建应用开始讲起,点击新建门户应用: 点击确定 我们先把这个应用发布。 确认发布。 显示出,下面这个已经发布成功后,我们就返回到主页面。 返回主界面,点…

《Docker系列》Docker安装MySQL 5.7

Docker安装MySQL 5.7 一、docker拉取MySQL 5.7镜像 docker pull mysql 拉取最新MySQL docker pull mysql:5.7 拉取指定版本MySQL 1 拉取mysql 5.7镜像 [rootzxy_master ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql d26998a7c52d: Pull complete 4a9d8a356…

JavaWeb之Servelt学习

1.Servlet 概念:运行在服务端的小程序 Servlet就是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则 将来我们自定义一个类,实现Servlet接口,复写方法 1.1快速入门 1.创建javaEE项目 2.定义类实…

DFS——连通性和搜索顺序(回溯)

文章目录概述连通性问题模板思考迷宫红与黑搜索顺序(回溯)模板思考马走日单词接龙分成互质组总结概述 定义 在深度优先搜索中,对于最新发现的顶点,如果它还有以此为顶点而未探测到的边,就沿此边继续探测下去,当顶点v的所有边都已…

JavaScript刷LeetCode拿offer-滑动窗口

一、前言 《JavaScript刷LeetCode拿offer-双指针技巧》中,简单地介绍了双指针技巧相比较单指针的优点,以及结合 Easy 难度的题目带大家进一步了解双指针的应用。 进入 Medium 难度之后,解题的关键在于如何构造双指针以及确定指针移动的规则…