首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我们如何将 iOS 应用启动时间减少 60%

第一印象是影响消费者转化主要因素,而启动时间通常反映了整个应用程序质量。另外,还有一些公司发现,延迟增加等同于销售量下降。 DoorDash ,我们对应用程序启动速度给予了很大关注。...我们努力优化消费者体验,并持续改善。 本文将探讨三个独立优化,将我们 iOS 消费者应用程序启动时间减少 60%。...其中一个最直接亮点是我们 Swift 协议一致性检查(检查一个类型是否符合协议)上花费时间,但为什么呢? 架构原则,如单一责任原则、关注点分离等,是我们 DoorDash 编写代码关键。...我们例子中,我们只是流程后期调用或引用框架中类,但框架仍然阻塞我们启动时间;为什么? 当应用程序启动并加载到内存中时,动态链接器(dyld)负责让它准备好。...所讨论第三方框架总共有九个模块初始化器,由于 dyld,所有这些初始化器都被授权我们应用程序运行 main() 之前运行。这九个初始化器归因于延迟我们应用程序启动总成本。

42320

fishhook详解

正式开启对fishhook讲解之前,先对之前dyld内容(应用程序加载——dyld动态链接器工作流程)做个回顾。 ?...Hook概述 Hook,中文译为“挂钩”或者“钩子”,iOS逆向中是指改变程序运行流程一种技术。...回顾dyld加载流程中,dyld::_main函数中做第二步就是加载共享缓存库。共享缓存库是什么呢?...这些动态库不会像静态库那样在编译时候就加载进应用程序内存,而是应用程序启动时候去动态链接。这些动态库就是放在共享缓存中。...经过上面的fishhook原理分析,我们再回到文章一开始第二个例子,为什么自己定义testFunc函数不能被Hook到呢? ?

1.5K10
您找到你想要的搜索结果了吗?
是的
没有找到

iOS 优化 - 启动优化

之前曾在iOS 优化-瘦身文章中提到过 iOS 优化将会是一个专题,今天就带来 iOS 优化系列第二篇,主要介绍一下启动优化,即如何减少应用启动时间。...: 冷启动:设备重启或者 App 很长时间未启动时会发生;这个过程需要建立进程并且启动支持 App 系统端服务;温启动:这个过程相对冷启动而言不会再重新建立系统端服务;恢复:严格意义上,这不是启动,只是一个从后台到前台状态改变...为什么 App 很久未启动也会发生冷启动 iOS 上,处于后台应用程序会逐渐从内存移除从而为前台应用程序提供更多内存,所以当用户正在使用内存密集型游戏应用,然后重新进入你 App 程序,这时你应用程序依赖于启动框架和守护程序也可能需要重新启动并从磁盘调入...加入DYLD_PRINT_STATISTICS_DETAILS后 DYLD_PRINT_STATISTICS_DETAILS 使用这种方式时,需要注意两个地方: iOS 15 以上真机不再支持打印相关耗时数据...扩展 iOS 15 及更高版本中,系统可能会根据设备条件预热您应用程序启动未运行应用程序进程以减少用户应用程序可用之前等待时间。

3.7K20

iOS逆向(5)-不知MachO怎敢说自己懂DYLD

三、从DYLD源码角度看APP启动流程 1、main函数中断点查看 首先思考,main函数中挂断点能不能查看到APP启动对应堆栈?...可以看到main函数断点并不能看到启动对应堆栈,说明main函数也是被别人调用,而不是处于app启动堆栈中。 既然main查不到启动堆栈,那么比app更早执行load方式是否可以找得到呢?...2、加载共享缓存库 iOS系统中,每个程序依赖动态库都需要通过dyld(位于/usr/lib/dyld)一个一个加载到内存,然而如果在每个程序运行时候都重复去加载一次,势必造成运行缓慢,为了优化启动速度和提高程序性能...源码中可以看到我们iOS系统中,共享缓存库被明确一定会被加载。 因为这种机制存在,使得iOS对这些基础库加载时候时间和内存都得到节约!...系列干货持续更新中(记得关注哦): iOS逆向(1)-密码学(RSA) iOS逆向(2)-密码学(Hash&对称加密) iOS逆向(3)-APP重签名 iOS逆向(4)-代码注入,非越狱窃取微信密码

1.7K41

APP生成与运行(二)

一、启动过程 iOS开发中,main函数是我们熟知程序启动入口,但实际上并非真正意义上入口,因为我们运行程序,再到main方法被调用之间,程序已经做了许许多多事情,比如我们熟知runtime初始化就发生在...二、main函数启动之前 Mach-O可执行文件 Mach-O文件格式是 OS X 与 iOS 系统上可执行文件格式,像我们编译过程产生.O文件,以及程序可执行文件,动态库等都是Mach-O文件。...上面提到库使用时候需要 Link,Link 方式有两种,静态和动态,于是便产生了静态库和动态库。...如果环境缺少动态库或者库版本不正确,就会导致程序无法运行(Linux 下喜闻乐见 lib not found 错误)。...为什么 iOS 8 要添加动态库支持?唯一理由大概就是 Extension 出现。

1.2K10

iOS16 和 Xcode14 如何改进 App 大小和运行时性能

实际 app 中,这个耗时会占用启动时间一半左右。...现在在 iOS 16、tvOS 16或 watchOS 9上运行现有应用程序,也会启用此功能。只要升级系统就能享受该功能。 那为什么能节省启动时间呢?我们来看下 dyld 启动流程。...苹果现在使用 dyld 版本是 dyld3 架构。dyld3 中 dyld closure 发生在 out-of-process 中,也就是应用安装到启动之间过程。...dyld2 执行过程是 in-process,也就是程序进程内执行,也就是说只有当应用程序启动时候,dyld2 才能开始执行任务; dyld3 则是部分 out-of-process,部分 in-process...这正是协议检查优化为什么启动加快原因。而且纯 Swift 项目中,协议无处不在,这种优化相对更明显。

3.8K30

应用程序加载——dyld动态链接器工作流程

实际上,苹果是禁止我们开发人员开发过程中使用自定义动态库,不然的话我们iOS热修复也不会这么复杂,直接使用动态库就可以做到随时修改应用程序内容了。...iOS/Mac操作系统当中,只有很少量进程只需要内核就能完成加载,基本上所有的进程都是动态链接,所以Mach-O镜像文件中会有很多对外部库和符号引用,但是这些引用并不能直接使用,启动时候还必须要通过这些引用进行内容填补...程序依赖系统动态库很多时候,这种做法能够大大改善应用程序启动性能。...而应用程序main函数是应用程序入口函数,也就是说,+load方法会在应用程序执行之前被调用,而应用程序执行之前最后一步就是动态链接,因此+load方法里面打的断点实际上就是定位到了动态链接阶段...经过搜索,发现它是_dyld_objc_notify_register中调用

1.9K10

解决 iOS 15 上 APP 莫名其妙地退出登录 解决 iOS 15 上 APP 莫名其妙地退出登录

iOS 15 公开推出后, 我们开始从用户端收到反馈报告:在打开我们应用程序(Cookpad) 时他们被莫名其妙反复退出到登录页。...即使能够重现这个问题,也100%确定手机点击应用图标的时候是解锁,所以我不明白为什么会出现这个Keychain错误。...: 1、启动应用程序 2、简单使用 3、强制退出应用 4、锁定设备并将其放置约 30 分钟 5、解锁设备 6、再次启动应用 每当我第 6 步中再次启动应用程序时, 100% 确定设备已解锁...Duet 现在试图先发制人地 "预热" 第三方应用程序,在你点击一个应用程序图标前几分钟,通过dyld和预主静态初始化器运行它们。然后,该应用程序被暂停,随后 "启动"似乎更快。...我们最初没有测试到它,因为我们很可能没有给 iOS 15 beta 版足够时间来 "学习" 我们使用习惯,所以这个问题只现实世界场景中再现,即设备认为很快就要启动应用程序

1.5K20

启动时间一些分析

一、App产生 探究iOS系统如何处理App启动之前,我们需要先了解下一个App是如何产生: 1、编译:我们打开一个xcode工程,会看到若干个.h/.m组成;当我们进行编译时,编译器会分别对每个...二、iOS如何启动App WWDC视频中对启动过程做了一些介绍,先看iOS 13以前用dyld2是如何启动App: ?...iOS 13之后,系统提供dyld3将启动过程解析Mach-O文件头部、解析动态库依赖、符号查找定位结果做了一个缓存,写到是disk中。...启动时候,就直接读取缓存并校验是否有效,再进行后续动态库加载、符号绑定和重定向以及静态初始化。 ​...三、开发时如何对这些时间进行分析 开发阶段,可以环境变量中设置DYLD_PRINT_STATISTICS值为1; ? 启动时候,就可以看到控制台打出了具体时间。

1.3K20

iOS应用代码注入防护

比如防止静态分析,代码混淆,逻辑混淆;防止重签名,应用ID检测,甚至是代码HASH检测等等那么这篇文章想聊聊关于代码注入检测,因为发现随着iOS系统更新,我们防护手段发生了一些变化。...利用yololib修改男子气概文件,添加库路径。应用启动时,使dyld会加载并执行。...我们使用MachOView分析如下: 当MachO文件中拥有这个字段,那么我们通过越狱环境插入动态库方式就会失效。起到防护作用。其原理dyld源码中可以分析到。...从iOS10开始,这种防护手段已失效 DYLD_INSERT_LIBRARIES检测 那么既然dyld加载过程不再检测__restrict了段就我们手动检测DYLD_INSERT_LIBRARIES...所以我们可以检索一下自己应用程序所加载动态库是否是我们源程序所有 其中libraries英文变量白名单。

77920

解决 iOS 15 上 APP 莫名其妙地退出登录

iOS 15 公开推出后, 我们开始从用户端收到反馈报告:在打开我们应用程序(Cookpad) 时他们被莫名其妙反复退出到登录页。...即使能够重现这个问题,也100%确定手机点击应用图标的时候是解锁,所以我不明白为什么会出现这个Keychain错误。...: 1、启动应用程序 2、简单使用 3、强制退出应用 4、锁定设备并将其放置约 30 分钟 5、解锁设备 6、再次启动应用 每当我第 6 步中再次启动应用程序时, 100% 确定设备已解锁,因此坚信我应该能够从...Duet 现在试图先发制人地 "预热" 第三方应用程序,在你点击一个应用程序图标前几分钟,通过dyld和预主静态初始化器运行它们。然后,该应用程序被暂停,随后 "启动"似乎更快。...我们最初没有测试到它,因为我们很可能没有给 iOS 15 beta 版足够时间来 "学习" 我们使用习惯,所以这个问题只现实世界场景中再现,即设备认为很快就要启动应用程序

85310

iOS 程序 main函数之前发生什么

主要参考: iOS程序启动->dyld加载->runtime初始化 过程 iOS 程序 main 函数之前发生了什么 image.png 一个iOS App main函数位于main.m...从dyld开始 Mach-O文件 Mach-O文件格式是OS X与iOS系统上可执行文件格式,像我们编译过程产生.O文件,以及程序可执行文件,动态库等都是Mach-O文件,它结构如下: image.png...-LoadCommands: 可以理解为加载命令,加载Mach-O文件时会使用这里数据来确定内存分布以及相关加载命令。...动态链接库 iOS 中用到所有系统framework都是动态链接,类比成插头和插排,静态链接代码在编译后静态链接过程就将插头和插排一个个插好,运行时直接执行二进制文件;而动态链接需要在程序启动时有需要再去完成插好相关插头和插排...这个是Xcode中看到Link列表: image.png 这些framework将会在动态连接过程中被加载,另外还有隐含linkframework,可以测试出来:先找到可执行文件,这里叫TestMain

78310

iOS应用代码注入防护

比如防止静态分析,代码混淆、逻辑混淆;防止重签名,应用ID检测、甚至是代码HASH检测等等。那么这篇文章想聊聊关于代码注入检测,因为发现随着iOS系统更新,我们防护手段发生了一些变化。...利用yololib修改MachO文件,添加库路径.应用启动时,dyld会加载并执行....此操作作用是可执行文件中添加一个Section.我们使用MachOView分析如下: 当MachO文件中拥有这个字段,那么我们通过越狱环境插入动态库方式就会失效.起到防护作用.其原理DYLD...但是新版dyld源码中去掉了__RESTRICT检测.从iOS10开始,这种防护手段已失效 DYLD_INSERT_LIBRARIES 检测 那么既然dyld加载过程不再检测__RESTRICT段了我们就手动检测.../MobileSubstrate.dylib 白名单检测 那么上面的检测只可以检测越狱环境中代码注入,非越狱环境中,逆向工程师可以利用yololib工具注入动态库.所以我们可以检索一下自己应用程序所加载动态库是否是我们源程序所有

68120

OC底层探索16 -应用程序加载OC底层探索16 -应用程序加载

1.2 静态库 使用静态链接:链接时会被完整复制到可执行文件中去,所以如果两个进程(程序)都使用了某个静态库,则这两个进程中都需要包含这份静态库代码。...动态库 1.4 dyld动态链接器 dyld(the dynamic link editor):【动态链接器】是苹果操作系统一个重要部分, iOS / macOS 系统中,仅有很少进程只需内核就可以完成加载...,基本上所有的进程都是动态链接,所以 Mach-O 镜像文件中会有很多对外部库和符号引用,但是这些引用并不能直接用,启动时还必须要通过这些引用进行内容填充,这个填充工作就是由 dyld 来完成...2、应用程序加载流程 库&静态库&动态库&dyld分别了解后,需要对整个流程有个认识。 ? 应用程序编译过程.png 3、APP启动加载流程 在任意+(void)load方法中打下断点。 ?...启动入口 根据堆栈信息得知:程序加载第一步就是dyld_dydl_start函数,通过下载dyld-源码来进一步探索。 3.1 _dyld_start函数 ?

36920

runtime那些事(三)——NSObject初始化 load 与 initialize

但若要了解 load 方法内部实现流程,还得从iOS程序启动流程开始说起。  ...,并开启 dyld 缓存策略(主要区分于App启动与热启动),从可执行文件依赖顺序开始,递归加载所有依赖动态链接库,所有依赖库通过 dyld 内部实现将 Mach-O 文件实例化为 image...但为什么该函数 runtime 中被注释为:快速扫描不带锁 load 方法。对于非懒加载类 load 方法 runtime 中被定义为不带锁 load 方法?到现在还一直有这个疑问。  ...整理写作过程中,自己也发现了有很多还需要待完善知识点,比如:每个类、分类 load 方法是何时、如何加载进可加载 load 列表中,dyld 动态链接库对 image 镜像文件操作流程。...后续会不断补充,若是文章中出现不准确地方还请多多指点。 ---- 该文章首次发表 简书:只不过是出来写写代码 博客,并自动同步至 腾讯云:只不过是出来写写iOS 博客

1.4K50

iOS应用代码注入防护

比如防止静态分析,代码混淆、逻辑混淆;防止重签名,应用ID检测、甚至是代码HASH检测等等。那么这篇文章想聊聊关于代码注入检测,因为发现随着iOS系统更新,我们防护手段发生了一些变化。...利用yololib修改MachO文件,添加库路径.应用启动时,dyld会加载并执行.....其原理DYLD源码中可以分析到. dyld源码分析 首先这里分析DYLD源码版本是519.2.2版本....但是新版dyld源码中去掉了__RESTRICT检测.从iOS10开始,这种防护手段已失效 DYLD_INSERT_LIBRARIES 检测 那么既然dyld加载过程不再检测__RESTRICT段了我们就手动检测.../MobileSubstrate.dylib 白名单检测 那么上面的检测只可以检测越狱环境中代码注入,非越狱环境中,逆向工程师可以利用yololib工具注入动态库.所以我们可以检索一下自己应用程序所加载动态库是否是我们源程序所有

2K50

iOS逆向工程工具集

本篇文章是在学习逆向工程时整理逆向工程工具集 只作为记录使用 并不是详细教程 阅读本篇教程需要你有一定逆向工程知识 一,Cycript 介绍 iOS运行时工具 可hook运行时进程 并提供了以下能力...1,开发者可以应用运行时查看和修改应用 得到所有正在使用类名或方法名 2,运行时修改实例变量值 3,Method Swizzling,替换特定方法实现 4,运行时调用任意代码 当然Cycript.../MobileSMS.app/MobileSMS(模块地址) 6, 启动lldb(Mac终端) 启动:lldb 连接接debug server : #lldb 执行lldb命令 #process...connect connect://iOSIP:端口(该端口需要和debug server指定端口一致) 五,dyld_decache 提取iOS系统内二进制文件 从iOS 3.1开始,包括frameworks...,dyld_shared_cache_armv7s,dyld_shared_cache_arm64),可使用dyld_decache将其中二进制文件提取出来 1, 用iFunBox从手机中拷贝dyld_deache

92810

从 iPhone OS 1.0 到 iOS 14 编程语言演变

之前关于苹果在 iOS 14 中使用了 Swift 和 SwiftUI 文章中,统计了 iOS 中使用 Swift 和 SwiftUI 内置应用程序数量。...最后,为了尽可能完整,对所有主要 iOS 版本进行了分析,从 iPhone OS 1.0 到 iOS 14。这将详细概述不同编程语言十多年 iOS 开发中演变。...范围 开始分析之前,让澄清一下范围。首先只分析了通常意义上 'iOS',即内核上方所有内容。不包括 XNU 内核和低级固件(SecureROM、基带、...)。...另一方面,计算了位于 dyld 共享缓存中框架,这是 iPhone OS 3.1 中引入缓存机制,并且仍在 iOS 14 中使用。 另一点是您可能会注意到没有 Objective-C++。...检测不同编程语言 之前关于苹果在 iOS 14 中使用 Swift 和 SwiftUI 文章中,统计了使用 Swift 和 SwiftUI 内置应用程序

2K30

IOS开发高级系列】dyld专题

1 dyld 1.1 dyld简介         iOS系统中,几乎所有的程序都会用到动态库,而动态库加载时候都需要用dyld(位于/usr/lib/dyld)程序进行链接。...相关文章:《iOSCornerstone工具操作方法详解》 2 IOS程序启动过程         系统先读取App可执行文件(Mach-O文件),从里面获得dyld路径,然后加载dylddyld...Mach-O文件格式是OS X与iOS系统上可执行文件格式,像我们编译过程产生.O文件,以及程序可执行文件,动态库等都是Mach-O文件。...LoadCommands:可以理解为加载命令,加载Mach-O文件时会使用这里数据来确定内存分布以及相关加载命令。...4 参考链接 iOS程序启动->dyld加载->runtime初始化 过程 http://www.cocoachina.com/ios/20170811/20228.html iOSdyld缓存是什么

58360

iOS之深入解析Xcode 13正式版发布40个新特性

大家好,又见面了,是你们朋友全栈君。...; 适用于 macOS 12 应用程序中,您可以使用属性检查器中 localize 属性非系统 NSMenuItem 上配置本地化等效键选项; iOS 15 应用程序中,可以使用属性检查器中...十四、链接 dyld 共享缓存已拆分为多个文件; 使用 macOS 12 或 iOS 15 或更高版本部署目标构建所有程序和 dylib 现在都使用链式修复格式; 统一 dyld2 和 dyld3。...现在所有平台上只有一个 dyld; DriverKit 运行时现在有一个 dyld 共享缓存; 如果 DYLD_PRINT_SEARCHING 环境变量启动时设置为 1,则 dyld 会打印出它搜索所有位置路径...默认情况下,这些资源使用内置音量 envelope 进行播放,该 envelope 开始时将信号慢慢提升并在结尾慢慢降低,以避免产生咔嗒声。

8.7K40
领券