大多数浏览器和
Developer App 均支持流媒体播放。
-
MetricKit 中的新增功能
利用 MetricKit 可以快速检测功率和性能衰退问题,并对 app 进行故障排除。 了解 app 最新可跟踪的指标,包括CPU指令,动画故障和退出原因。并了解有关 MetricKit 的诊断信息,从而帮助你解决挂起,崩溃和磁盘写入问题。
资源
相关视频
WWDC21
WWDC20
-
下载
(你好 WWDC 2020)
你好 欢迎来到 WWDC
(MetricKit 中的新增功能) 大家好 我叫 Phil Azar 我是电源和性能工具团队的软件工程师 今天我很高兴能够和大家分享 iOS 14 中 MetricKit 的新增功能 App 是软件体验的关键部分 App 用户与日俱增 如果 App 在电池续航时间 和性能方面表现出色 用户满意度就会提升 并有助于营造良好的软件综合体验 我们的团队致力于为你提供强大的工具 从电池续航时间和性能方面改进你的 App 去年 我们引入了许多这样的工具 来帮助你实现这一目标 MetricKit 就是其中之一 它是一个用于收集 电量和性能指标的设备内框架 今天我很高兴与大家分享 MetricKit 下一个版本的新功能 首先我们将简要回顾一下 如何使用 MetricKit 其次我们将讨论一些强大的新指标和诊断 然后我们将对这些新接口进行深入探讨 最后我们会做一个简短的总结
让我们先回顾一下 现有的 MetricKit 是如何使用的 MetricKit 是一个从零开始设计的框架 旨在提供开发周期各个阶段的数据 而通常在这些阶段中你无法直接 获得用户或 App 运行设备的数据 包括 TestFlight 等外部 beta 测试阶段 或者在 App Store 发布后 这意味着 对于开发者来说 MetricKit 是一款功能强大的工具 如果在这些阶段善用此工具 就能从大量用户中获得 App 性能的真实数据 并可以帮助你 找出性能回归的趋势和模式 要使用 MetricKit 你需要遵循三个简单的步骤 第一步是将 MetricKit 框架 链接并导入到你的代码中
第二步是实例化一个我们称之为 MetricManager 的共享实例 它是一个类 是你与这个框架的接触点
最后 你需要实施既有的订户委托协议 以便开始从框架接收指标 这是上述步骤的代码示例 在本例中 我们实施了一个 名为 MySubscriber 的自定义类 以帮助保持代码的整洁 在链接 MetricKit 框架之后 我们让这个新类遵循订户协议 实例化一个 MetricManager 共享实例 并为 metricManager 添加新自定义类的引用
我们还建议在反初始化时 删除自定义类的引用
完成此操作后 最后一步是实施 didReceive 协议方法 这样你就可以接收指标报告
让我们回顾一下系统是如何 通过 MetricKit 聚合这些 报告并将其交付给 App 的 一天当中 操作系统会在 App 使用过程中 被动聚合性能数据 为保护用户隐私 这些数据都是匿名的 在一天结束时 这些数据被汇总成一个 24 小时报告 我们称之为 MetricKit 报告 指标报告由 MetricKit 接口强类型化 让我们看看报告中包含哪些类型的数据 MetricKit 报告包含各种数据 包括启动时间、CPU 时间、内存等等 这是我们选取的一个 MetricKit 报告 并已转换为人类可读的格式 这让我们更容易看到数据被划分为 三种类型的聚合 累计、平均和分段数据 在后处理中这些数据非常有用 可以帮助识别 App 每个版本的性能回归 并且可以与本地上下文结合使用 以解决具有挑战性的问题 然而 在某些领域 我们现有的指标可能不足以 充分描述回归问题的特征
让我们来看一个常见的例子: 我们的启动性能数据 这里我们看到冷启动的数量 即 App 在内存中没有 任何资源的情况下从头启动的数量 远远超过了 App 恢复运行的数量 在典型的性能良好的 App 中 恢复运行的数量应该远多于启动的数量 这里似乎有些不对劲 另一个常见例子是累计 CPU 时间 请注意我们的累计 CPU 时间 远远小于累计前台时间 这似乎是一件好事 但尚不清楚 此工作水平表明性能下降还是改进 因为 CPU 时间受时钟频率的限制 作为开发人员 我们的第一反应可能是更精确地进行量化 而目前来看 这不是一个简单的问题 这方面明显需要改进 我们需要更多的细节 才能更深入地研究这些问题 今年 有了 MetricKit 2.0 我们将为你提供一些新指标 我们认为这些指标将帮助你 更深入地研究这些常见问题案例 我们的团队经过不懈努力 扩展出了一个指标子集 帮助你进一步了解 App 的工作负载 性能和稳定性 其中包括 CPU 指令 滚动故障和 App 退出 我们先来回顾一下 CPU 指令 MetricKit 中的 CPU 指令 是 MXCPUMetic 类的新成员 此指标总结了 App 每日 累计的退役指令 CPU 指令是 App 在 CPU 上 所做工作的绝对指标 它不受硬件和频率的影响 这将使你能够更精确地量化 App 的总工作负载 接下来 让我们谈谈滚动故障 滚动故障是我们今年推出的一项新指标 可帮助你深入了解 App 的图形性能 滚动故障是指滚动过程中 完成渲染的画面 没有按预期时间在屏幕上显示 这通常会导致丢帧 用户会明显感觉到动画不流畅 在 MetricKit 中 我们通过 UIScrollView 为你提供 App 出现滚动故障与正常滚动 所用时间的比率
为了更深入地了解故障的技术细节 我建议你观看我们今年的讲座 内容涵盖滚动故障 以及如何使用 XCTest 指标 来度量这些故障 最后但同样重要的是 我们提供了 App 退出原因 今年我们将提供 App 退出和终止相关的指标 你将收到一份每日摘要 其中包括 App 在前台和后台退出的原因和次数 我们认为这将有助于追踪 与 App 启动和 使用后台运行时框架相关的常见问题 为了更深入地了解如何利用这些指标 并采用最佳实践 我鼓励大家观看 我们今年关于 App 终止的讲座 题为《为什么我的 app 被终止了?》 (为什么我的 app 被终止了?) 这些就是我们今年的新指标 我们认为当你在 MetricKit 数据中 观察性能回归问题时 这些指标会为你提供更多确定性依据 让我们更仔细地回顾一下指标报告 并将重点放在 一个我们仍然无法确定原因的领域 在 App 挂起持续时间直方图中 我们看到了一些值得警惕的条目 可能会严重干扰用户体验 就目前来看 这绝对是一个性能回归问题 但仅凭指标我们尚无法确定根本原因 我们需要一些其他诊断数据 例如挂起时的回溯 以便解发生了什么情况 这就把我们带到了今年 MetricKit 推出的下一个重要功能 它将帮助你更深入地 了解性能回归的另一个类 MetricKit 诊断 MetricKit 2.0 将提供一个新的接口 让你能够有针对性地获得诊断信息 这些诊断信息可以作为 各类型回归的行动依据 包括挂起、崩溃 磁盘写入异常和 CPU 异常
要在 MetricKit 2.0 中接收诊断信息 你需要做的就是实施一个新的 MetricManagerSubscriber 协议方法 就是这么简单! 这个新协议看起来几乎与去年 didReceive 指标报告的委托方法相同 我们相信你们中的许多人能够利用 已经为 MetricKit 构建好的相同流程 然而 这个协议不仅看起来相似 它的运作方式也是一样的 从语义上看 MetricKit 诊断与 MetricKit 指标 的运作方式几乎相同 如果我们再看一下刚才的时间线 随着 App 在一天中的使用 除了指标数据 MetricKit 系统现在还会被动地收集 使用过程中出现的回归相关诊断信息 然后 系统将它们汇总成 并行的每日诊断报告 可与您的每日指标报告一起使用 现在 如果你看到指标出现回归问题 例如挂起 而又存在与指标报告一同生成的诊断报告 那你就可以进行参照对比 该诊断报告直接一对一地映射到 与其并行的指标报告 让我们换个角度 更深入地了解这个新接口 并熟悉它的功能 新的诊断接口与旧的指标接口相仿 而且我们有以下的新基类: MXDiagnostic 是所有诊断都从中继承的基类 MXDiagnosticPayload 是包含当天所有诊断信息的载体类 MXCallStackTree 是一个新的数据类 包含了回归时间回溯 供设备外使用 MXDiagnostics 包含在 MXDiagnosticPayload 中 它含有回归发生时的 App 元数据 例如具体版本和按诊断分列的数据
按诊断分列的数据是我们今年 针对每个诊断子类提供的特有数据子集 MXCallStackTree 是贯穿始终的一个类
MXCallStackTree 是我们提供的一个新数据类 它包含了回归发生时的回溯 这些回溯是未符号化的 旨在用于设备外处理 它们将为你提供一组丰富的信息 帮助你诊断和捕捉回归问题的本质
下面是这些 callStackTree 转换为 人类可读的 JSON 之后的一个示例 我们可以看到用 ATOS(自动调优系统) 这样的工具来符号化单个帧 所需的一切都已具备 这包括二进制信息 如 UU ID、偏移量和名称 以及帧地址
这些新的 callStackTree 数据结构 具有高度的可移植性 我们今年推出的其他性能工具中也有用到 (使用电源和性能 API 识别趋势) 如需了解更多信息 敬请观看 我们关于新的电源和性能 API 的讲座 正如我们前面所说 今年我们将推出一组 MXDiagnostic 的四个新子类 挂起、CPU 异常、磁盘写入异常和崩溃 现在让我们看一下每个 新的诊断子类中包含的独特数据 从挂起开始 挂起这一回归问题是指 App 对用户输入长时间无反应 这是因为 App 的主线程被阻塞或繁忙 通过 MetricKit 接口提供的挂起诊断 将记录 App 主线程无响应的时间 以及主线程的回溯 接下来是 CPU 异常 在 Xcode Organizer 中 也被称为能耗日志 这些诊断将包含 CPU 使用时间 CPU 高利用率期间的总采样时间 以及占用 CPU 时间的线程回溯 CPU 异常诊断与指标报告结合使用 可以发挥强大的优势 能够帮助识别不容易重现的回归问题 接下来我们看看磁盘写入 磁盘写入异常诊断 与 CPU 异常诊断非常相似 每个诊断将包含导致异常的 写入总数 以及导致过量写入的线程回溯 当 App 突破每天 1 GB 的阈值时 系统就会生成这类诊断 最后但同样重要的是崩溃诊断 今年 我们很荣幸地宣布 MetricKit 将为大家 提供 App 崩溃诊断 每次 App 崩溃时 系统都会通过 MetricKit 诊断接口 向你提供 MXCrashDiagnostic 其中包含异常信息、终止原因 错误访问导致崩溃时的 虚拟内存区域信息以及回溯 总而言之 MetricKit 诊断 是一个强大的新工具 可以让你在真实的客户用例中 找到回归问题的根本原因 最后让我们总结一下今天所讲的内容 MetricKit 2.0 包含了许多新功能 可以帮助你将优化工作推向新的高度 我们提供了新的指标 让你更深入地了解 你的客户和 beta 测试群体中 发生的回归问题 我们还将提供有针对性的诊断 使你能够在这些群体中 捕捉难以再现的回归问题 最后 对于你们而言 获得这些功能的代价极低 因为这些新功能所需的接口极易实施 或者所需接口已经存在 (用 Xcode Organizer 诊断性能问题) 今年我们推出了大量精彩的新内容 还有很多有用的旧内容 我鼓励大家进一步了解 (使用 XCTEST 消除动画故障) 再次感谢你的收看 祝您在 WWDC 2020 度过愉快的时光
-
-
2:11 - Using MetricKit
import MetricKit class MySubscriber: NSObject, MXMetricManagerSubscriber { var metricManager: MXMetricManager? override init() { super.init() metricManager = MXMetricManager.shared metricManager?.add(self) } override deinit() { metricManager?.remove(self) } func didReceive(_ payload: [MXMetricPayload]) { for metricPayload in payload { // Do something with metricPayload. } } }
-
8:14 - Adopting MetricKit Diagnostics
func didReceive(_ payload: [MXDiagnosticPayload]) { for diagnosticPayload in payload { // Consume diagnosticPayload. } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。