ETTrace 👽

无需 Xcode 或 Instruments,即可在本地测量您的应用性能。请在发布博文中阅读所有相关信息

Example Flamechart

构建和安装

ETTrace 包含两个组件:作为命令行工具的“runner”以及您的应用链接到的框架。

首先,使用 brew install emergetools/homebrew-tap/ettrace 安装 runner。然后使用以下方法之一安装框架

Swift Package Manager

使用 URL https://github.com/EmergeTools/ETTrace 将此仓库添加为 Swift Package(在 Xcode 或您的 Package.swift 文件中)。选择 “ETTrace” 作为要添加到您应用的产品包。

警告

请务必按照以下屏幕截图所示,将 ETTrace 产品包添加到您的应用。

SPM Installation

手动

或者,运行 ./build.sh 来构建 xcframework ETTrace.xcframework。将此 xcframework 链接到您的应用。

注意

链接框架到您的应用是唯一的安装步骤,您无需进行任何代码更改。

如果一切设置正确,当您启动应用时,控制台将打印 “Starting ETTrace”。

用户评价

我们的用户喜爱 ETTrace,并认为它在他们的 iOS 开发过程中至关重要。以下是一些用户的评价:

使用方法

启动您的应用并运行 ettraceettrace --simulator。分析完成后,结果将显示在 https://emergetools.com/flamegraph

注意:始终通过手动点击 iOS 主屏幕上的图标来启动应用,通过 Xcode 运行应用可能会导致结果不准确。

dSYMs

您可以使用 --dsyms 标志将 ettrace 指向包含 dsyms 的文件夹。如果 dsyms 已被 Spotlight 索引,它们将被自动找到并使用。

启动时运行

使用 --launch 标志在应用启动时开始记录。当您首次使用此标志连接到应用时,应用将强制退出。在下次启动时,它将自动开始分析并捕获您的所有 main 函数。在某些情况下,您需要记录安装后的首次启动。您不能为此使用 --launch 标志,因为它需要重新启动应用。相反,在您的 Info.plist 中添加一个布尔值,将其设置为 YES,键为 ETTraceRunAtStartup。然后您可以正常运行 ettrace,无需 --launch 标志,仍然可以在应用启动时开始分析。

幕后原理

ETTrace 产生一个新的线程,定期捕获主线程的堆栈跟踪。这是一种基于采样的性能分析方法。采样线程在 ettrace.framework 加载时(+load 方法)或 CLI 向应用程序发送消息时启动。这些控制消息和采样数据使用 PeerTalk 进行通信。

向火焰图添加事件

ETTrace 从 v1.0 版本开始支持在火焰图中显示事件。您可以使用它们来跟踪代码中的用户流程,您可以通过在代码中发布通知轻松添加它们

NotificationCenter.default.post(name: Notification.Name(rawValue: "EmergeMetricStarted" | "EmergeMetricEnded"), 
                                object: nil,
                                userInfo: [
    "metric": "EVENT_NAME"
])

使用 EmergeMetricStarted 注册流程的开始,使用 EmergeMetricEnded 跟踪流程的结束。

例如,我们将发布此通知来跟踪用户登录流程的开始。

NotificationCenter.default.post(name: Notification.Name(rawValue: "EmergeMetricStarted"), 
                                object: nil,
                                userInfo: [
    "metric": "USER_LOGIN"
])

然后在用户成功登录时发布此通知

NotificationCenter.default.post(name: Notification.Name(rawValue: "EmergeMetricEnded"), 
                                object: nil,
                                userInfo: [
    "metric": "USER_LOGIN"
])

在火焰图中,我们将能够看到如下流程: 事件火焰图

分析后台线程

使用 --multi-thread (-m) 标志记录所有线程。这将为每个记录的线程提供一个 output.json 文件,您可以将其拖入 ETTrace。