正如标题所示,在这篇文章中,我将详细写出应用程序在启动时的处理和加速要点。

可能有很多人意识到他们自己的应用程序中的启动时间问题,并正在努力加快启动速度。
如果你能在这样的时候稍微参考一下,我将不胜感激。

如果你时间不多,只想快速总结一下改进措施,我想你应该看看文末的总结。

测量开机时间

首先,让我们测量应用程序的启动时间以检查当前情况。

如果只想查看启动时间,可以在 Xcode 中使用Firebase PerformanceOrganizer -> Launch Time。但是,如果您想查看启动时间,我想对测量进行更详细的分析。
在这种情况下,请使用 App Launch of Instruments。

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

使用方便,选择您要测量的应用程序,然后按左上角的红色图标开始记录测量。
该应用程序将在未经许可的情况下启动,然后仅出现字符Recording,因此请停止,因为测量已完成。

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

你可以得到这样的结果。

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

测量本身现已完成。让我们仔细看看测量结果。

启动时处理

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

启动过程分为两部分。正如您在图表中看到的,它是紫色部分和绿色部分。
说的很简单,紫色部分就是代码以外的系统初始化处理的时间。另一方面,绿色部分是执行代码实现部分的应用程序初始化处理的时间。

这个信息基本优化应用启动是参考。
让我们仔细看看里面有什么。

初始化

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

我必须在这里提前道歉。标题说明了加速启动的一切,但实际上,这是唯一的部分!我没有答案。 .
我阅读了底部引用的文档,但找不到任何相关信息。

从这里开始,只是一个猜测,但我认为它是在做低级处理,无法从外部操作。
如果有人知道更多信息,请随时发表评论。

系统接口初始化

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

处理主要是dyldlibSystemInit init

代号

dyld 分析资源并加载共享库和框架。

改进
删除不必要的实现并将dynamic library更改为static library非常有效。

为了公开不必要的实现,我周长用过的。我见过一些类似的服务,但我认为这是最准确的。
最让我印象深刻的是,即使是仅由没有调用者的方法使用的方法也被检测为死代码。
但是,擦除时仍然需要手动检查。很难完美地检测到死代码。

转换为 static library 将 CocoaPods 处理的库移至 SwiftPM。

libSystemInit 初始化

libSystemInit init 初始化应用程序中的低级系统组件。
这主要是系统端的工作,成本是固定的。所以你不必担心。

至此静态运行时初始化完成。

静态运行时初始化

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

System Interface Initialization 不同,这里我们为 Objective-C 和 Swift 进行运行时初始化。
代码中的任何静态初始化方法都在此处执行。应用程序不应该在这里做任何事情,除非它们通常需要一个初始化方法。

改进
至于静态初始化方法长什么样子,Objective-C的+load方法加载,__attribute__((constructor))方法等。
如果存在这样的处理,考虑是否真的有必要,是否可以推迟。

UIKit 初始化

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

现在我们终于到了绿色部分。

UIKit 初始化实例化UIApplicationUIApplicationDelegate
特别是,继承UIApplication 或在UIApplicationDelegate 的初始化中做一些事情会影响这部分。

应用程序初始化

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

这是绿色部分工程师应该注意的主要部分。
didFinishLaunchingwithOptions总是在应用启动的时候被调用,但是didFinishLaunchingwithOptions实现的过程对应的是Application Initialization。其他 AppDelegate 和 Scenedelegate 方法在应用程序初始化中完成。

改进
这里的改进对于 AppDelegate 和 Scenedelegate 是通用的,让我们延迟执行不必要的处理。
例如,不需要的库的初始化应该在第一次使用库时完成,而不是didFinishLaunchingwithOptions

// SampleLibraryというライブラリを使うとする
// SampleLibraryを使用するラッパーを作る

class SampleLibraryClient {
  static let shared = SampleLibraryClient()

  init() {
    // ここでライブラリの初期化を行う
  }
}

还有,我还没测过,所以不能确定,但​​是如果你还没有引入UIScene的话,引入它会改变启动生命周期,似乎有效果。

初始帧渲染

iOSアプリ起動高速化の全て(起動時間の計測・起動時の処理・高速化のためにすべきこと)

Application Initialization 完成了启动应用程序的准备工作,接下来就是帧渲染了。
渲染框架包括创建视图、创建布局和绘图。如果是复杂的布局,当然需要更长的时间。

改进
关键是使首先显示的视图简单。具体来说,以下是有效的。

  • 减少视图层次结构并使视图尽可能平坦
  • 减少视图自动布局约束
  • 显示不需要在启动过程中显示的视图有延迟

这总结了应用程序启动的流程以及可以在每个阶段进行的改进。

概括

以下是加快启动时间可以采取的措施列表。

  • 删除未使用的实现和资源
  • 将库 dynamic library 迁移到 static library
  • 消除代码中的静态初始化方法
  • 使用 AppDelegate (Scenedelegate) 延迟不必要的处理
  • 减少初始显示视图的层次结构
  • 减少视图自动布局约束
  • 显示不需要在启动过程中显示的视图有延迟

我想我会写一篇关于具体数字的单独博客,比如我在每个阶段能够改进多少。
我也会链接到这篇文章。

后记:目前的进展已经出炉!
加速 iOS 应用启动的挑战!检查不必要的代码和资源并使库静态化

参考

优化应用启动
减少应用程序的启动时间


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626071.html

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-22
  • 2021-12-06
  • 2022-12-23
  • 2022-12-23
  • 2021-12-30
猜你喜欢
  • 2021-09-13
  • 2022-12-23
  • 2021-10-19
  • 2022-12-23
  • 2021-07-04
  • 2021-07-24
  • 2021-10-15
相关资源
相似解决方案