我的编程空间,编程开发者的网络收藏夹
学习永远不晚

iOS App 启动优化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

iOS App 启动优化

作为程序猿来说,“性能优化”是我们都很熟悉的词,也是我们需要不断努以及持续进的事情;其实优化是个很严谨的课题,因为细分来说的话有种优化向 ,但是切忌在实际开发过程中不能盲目的为了优化而优化,这样有时可能会造成适得其反的负效果,需要我们根据实际场景以及业务需求进合理优化。接下来进入正题,本文将会以iOS App的启动优化为展开点进探讨。

启动流程:

iOS App 的启动我们都知道分为pre-main 和 main() 两个阶段,并且在这两个阶段中,系统会进行系列的加载操作,过程如下:

1、pre-main阶段

加载应的可执件

加载dyld动态连接器

dyld递归加载应所有依赖的动态链接库dylib

2、main()阶段

dyld调 main()

调UIApplicationMain()

调applicationWillFinishLaunching

调didFinishLaunchingWithOptions

阶段优化项

1、pre-main阶段

针对 pre-main 阶段做优化时,我们需要先详细了解其加载过程,这个可以在2016年WWDC 的 Optimizing App Startup Time 中详细了解到, 相关材料

1.1 Load dylibs

这阶段dyld分析应依赖的 dylib (xcode7以后.dylib已改为名.tbd),找到其 mach-o 件,打开和读取这些件并验证其有效性,接着会找到代码签名注册到内核,最后对 dylib 的每个 segment 调 mmap()。不过这的 dylib 部分都是系统库,不需要我们去做额外的优化。

优化结论

1.2 Rebase/Bind

在dylib的加载过程中,系统为了安全考虑,引了ASLR (Address Space Layout Randomization)技术和 代码签名。由于ASLR的存在,镜像(Image,包括可执件、 dylib和bundle)会在随机的地址上加载,和 之前指针指向的地址(preferred_address)会有个偏差(slide), dyld需要修正这个偏差,来指向正确的 地址。 Rebase在前, Bind在后, Rebase做的是将镜像读内存,修正镜像内部的指针,性能消耗主要在 IO。 Bind做的是查询符号表,设置指向镜像外部的指针,性能消耗主要在CPU计算。

优化结论:

1.3 Objc setup

部分ObjC初始化作已经在Rebase/Bind阶段做完了,这步dyld会注册所有声明过的ObjC类,将分类插 到类的法列表,再检查每个selector的唯性。

在这步倒没什么优化可做的, Rebase/Bind阶段优化好了,这步的耗时也会减少。

1.4 Initializers

在这阶段, dyld开始运程序的初始化函数,调每个Objc类和分类的+load法,调C/C++ 中的构造器 函数(attribute((constructor))修饰的函数),和创建基本类型的C++静态全局变量。 Initializers阶段执 完后, dyld开始调main()函数。

优化结论:

2、main()阶段

在这阶段,主要优化重点放在 SDK初始化、业务具注册、整体

didFinishLaunchingWithOptions 法中,因为我们的些第三 app 格配置、启动引导显示状态逻辑、版本更新逻辑等等基本都会在这进,如果这部分逻辑没有做好优化梳理,随着业务不断拓展,臃肿的业务逻辑会直接导致启动时 间加。

场景补充:

另外,在我们实际开发过程中,很多项的控制器都会有些后台可配、较为丰富的结构或者推荐数据 进展示,且我们的展示速度通常也会被纳启动优化的部分,其实对于这种类型的优化,如果我 们还只是传统的 api -> data -> UI 式进的话,就很难有明显的改善空间,因为户的络状态 并不是可控项,如果不做其他处理的话,那在很多场景下对户来说,即使我们放上些占位图,展示的样式也是很不友好的,毕竟控制器对户的第视觉冲击影响还是较的。

对于这种场景下的优化来说,般我们可以采取 Local + Network + Update 的式在定程度上优化 加载速度: 即:

这样做的好处是

当然这种也并不是唯的应对式,且也并对所有场景都适,只是提供种思路已,还是需要根据 项的实际场景选择适合的优化案。

统计时

另外如果在开发过程中,我们想直观的查看 app 启动期间,各阶段的耗时情况,也可以在Xcode,的 edit scheme 设置添加 DYLD_PRINT_STATISTICS 为1 ,打印启动时,例如

优化前启动时:

优化后启动时:

当然,这些log我们仅仅只能在开发调试阶段查看打印,那么在实际项中,我们需要对线上项的启动数据 进监控,以便及时的定位和优化那些影响 app 启动时的环节,这时我们应该怎样更好的处理呢?

当然我们可以通过服务器埋点上报的式统计分析,不过这样来会发现我们的统计成本就会增 加,且结果分析也会变得不那么灵活。所以这推荐种简单的监控式,那就是友盟的 U-APM 应能性 能监控SDK ,只需要我们进简单的pod集成之后,便可根据我们的实际需要进动或者动监控启动数 据,详情可以参考 U-APM, 并且为了便我们对数据进分析,友盟后台已经根据这些数据帮我们绘制出 了对应的分布图,我们可以了然的得出启动耗时分布、启动类型占等等,如图:

除此之外,我们还可以通过SDK进崩溃分析、 ANR分析、监控告警、卡顿分析、内存分析等等诸多功能, 有了 U-APM 这个监控平台,其实在实际开发过程中很程度的提升了我们对线上 app 的优化分析效率。

当然本的介绍也只是较浅显的优化项,仅供参考以及思路引导,优化之路任重道远,还需要我们不断 的去探索、发现、提。不过最后还是要提醒句:在实际项开发过程中,不要为了优化优化,要根据 项情况有针对性的进优化。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

iOS App 启动优化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

iOS App 启动优化

作为程序猿来说,“性能优化”是我们都很熟悉的词,也是我们需要不断努以及持续进的事情,本文将会以iOS App的启动优化为展开点进探讨。

高德APP启动耗时剖析与优化实践(iOS篇)

前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内。就像产品们用后说的,快到不习惯。算一下每天为用户省下的时间,还是蛮有成就感的,本文做个小结。(文中配图
2023-06-04

Android性能优化(一)App启动时间优化

App启动时间优化 一、首先我们需要清楚App的主题加载 你的App的主题位于 res/values/styles我们点击Light主题进去,会发现此主题位于 app/build/intermediates/exploded-oar/com
2022-06-06

Android APP启动方式、启动流程及启动优化分析

本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式、app启动流程和app启动优化等知识! app应用启动方式 1、冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这
2022-06-06

Android App应用启动分析与优化

app的启动方式: 1.)冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建
2022-06-06

得物App安卓冷启动优化-Application篇

对于通过点击图标启动的普通场景,默认会在Application执行完整的初始化工作,但是一些层级比较深的功能,例如客服中心,编辑收货地址这类,即使用户以最快速度直接进入这些页面,也是需要至少1s以上的操作时间,所以这些功能相关的初始化工作也

如何清除 iOS APP 的启动屏幕缓存

我在应用程序的沙盒中进行了一些挖掘,发现该 Library 文件夹中有一个名为 SplashBoard 的文件夹,该文件夹是启动屏缓存的存储位置。
iOSAPP缓存2024-12-03

Android启动优化

一、启动分类 Android的启动分冷启动、热启动、温启动。 1、冷启动:当启动应用时,后台没有这个应用的进程,需创建新的进程。 冷启动过程: click (点击应用图标)——>ipc——>Process.start——>ActivityT
2022-06-06

Android架构师之路之App启动性能速度优化

随着项目不断的快速迭代,往往会造成App启动卡慢现象,因为可能在App主进程启动阶段或者在主界面启动阶段放了很多初始化其他业务的逻辑,而这些业务落地可能一开始并不需要用到。

Android性能优化(一)启动优化

以前做手机的时候,我非常重视app的性能优化。其实一直以来,在工作中我总会去强调性能优化的重要性。但是,很多时候,由于一些外界因素,我们对app的一些性能指标不会那么重视。但是,性能优化依然是做好一个产品的重中之重。试想一下,如果用户费了很
2022-06-06

不改一行业务代码,飞书 iOS 低端机启动优化实践

本文将结合飞书启动优化,给出选取 GCD 队列的最佳实践,也提供针对低端机的启动优化思路。

win7启动项怎么优化

今天小编给大家分享一下win7启动项怎么优化的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。win7启动项优化教程1、首先点开
2023-07-01

MySQL在Linux的启动优化

以下是一些优化MySQL在Linux上启动的建议:调整内核参数:可以通过修改Linux内核参数来优化MySQL的性能。一些常见的参数包括最大连接数、文件描述符限制、IO线程数等。使用SSD硬盘:使用固态硬盘(SSD)可以提高MySQL的性能
MySQL在Linux的启动优化
2024-08-16

win10启动慢如何优化

这篇“win10启动慢如何优化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10启动慢如何优化”文章吧。win10启动
2023-07-01

Android adb命令 关闭app 和 启动app 还有重启app命令

以下是Android中使用adb命令关闭应用程序、启动应用程序和重启应用程序的方法: 1.关闭应用程序 使用以下命令可以关闭正在运行的应用程序: adb shell am force-stop package_name 其中,package
2023-08-20

Android应用启动速度优化

开发Android应用中,随着功能越来越多,启动速度越来越慢。有没有办法让自己应用启动速度快一点呢? 方法是人想出来的。先说说我的实现方法: 1 将onCreate 中初始化的内容,移动到线程中做初始化,加载等 2 初始化完成之后,通过Ha
2022-06-06

优化SpringBoot程序启动速度

Spring Boot 程序优化 一、延迟初始化Bean 一般在 SpringBoot 中都拥有很多的耗时任务,比如数据库建立连接、初始线程池的创建等等,我们可以延迟这些操作的初始化,来达到优化启动速度的目的。Spring Boot
2023-08-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录