ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
MetricKitの新機能
MetricKitを導入して、電力とパフォーマンス低下を素早く検知し、Appに起きた問題のトラブルシュートをしましょう。CPUインストラクション、アニメーションヒッチ、終了理由といったAppで追跡することが可能な最新メトリクスを説明します。またハング、クラッシュ、ディスク書き込みのトラブルシュートの助けとなる、MetricKitでできる診断についてもお伝えします。
リソース
関連ビデオ
WWDC21
- 究極のAppパフォーマンスサバイバルガイド
- Appのハングアップの理解と解消
- Appのパワーとパフォーマンスに関する不具合の診断
- Xcode OrganizerによるTestFlightクラッシュのトリアージ
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ
“MetricKitの最新情報” 私はフィル・アザールです 電力と性能ツールチームの ソフトウエアエンジニアです 本日はiOS 14のMetricKitの 新機能を皆さんにお伝えします アプリケーションはユーザーの ソフトウエア体験の重要な一部分です そしてアプリケーションは今まで以上に 使われるようになっています アプリケーションがバッテリー持ちも良く 性能も良く作られていれば ユーザーは喜びます そして全体としてのソフトウエア体験の 向上にも貢献します 私たちのチームはバッテリーの持ちと 性能面を改善するために 役立つ強力なツールを ご提供することを使命としています 昨年 MetricKitをはじめとして それを支援する数多くの― ツールを導入しました デバイス上でバッテリー持ちと性能に関する メトリックを収集するフレームワークです 本日はMetricKitの次のバージョンの 新機能をお伝えできることにワクワクしています 最初にMetricKitの使い方について 簡単におさらいします それから新しい強力なメトリックと 診断機能についての議論に移ります さらにそれらの新しいインターフェイスの 詳細を見ていきます それから簡単にまとめを行います
本日の最初の話題は MetricKitの使い方の再確認です フレームワークとしてのMetricKitは まったくゼロから設計され アプリケーションを実行する ユーザーやデバイスに 直接アクセスできないことが多い 開発サイクル段階における― データを提供するために 開発されました そのような段階とは 例えば TestFlightのような外部ベータテストや App Storeへの出荷後があります つまりデベロッパとして MetricKitをそのような段階で 使用することで アプリケーションの性能データを 多くの実利用者から 実際に収集できるようになります それは性能上の不具合に関する 傾向やパターンの発見を支援します MetricKitを使用するには 以下の 3つの簡単なステップに従ってください 最初はMetricKitフレームワークを プログラムにリンクしてインポートすることです
2番目は共有インスタンスを 作成することです いわゆるMetricManagerで フレームワークにおける問い合わせ先として 機能するクラスです
最後に サブスクライバーデリゲート プロトコルを実装することで フレームワークからメトリックを 受け取ることができます これは実際のプログラムで 前述のステップを実装する例です この例ではMySubscriberという カスタムクラスを実装して プログラムをクリーンな状態に保っています MetricKitフレームワークをリンクした後 この新しいクラスをサブスクライバー プロトコルに適合させて 共有Metric Managerのインスタンスを 作成します そして新しいカスタムクラスから マネージャーへの参照を追加します
初期化解除の際にはカスタムクラスへの 参照を削除することを推奨します
それが終わったら 最後のステップはdidReceive プロトコルメソッドの実装です これでメトリックペイロードを 受け取れるようになります
システムが どのようにこのペイロードを収集して MetricKitを通じて アプリケーションに届けるか確認しましょう 1日の間に アプリケーションが利用されると OSは受動的にアプリケーションの 性能データを収集します データは匿名化され プライバシーを 保護するよう設計されています そして1日の終わりにそのデータは 24時間分のペイロードとしてまとめられます これがMetricKitペイロードです メトリックペイロードはMetricKit インターフェイスで強力に分類されています ペイロードにどのようなデータが 含まれているか確認してみましょう MetricKitペイロードには 様々な種類のデータが含まれています 起動回数 CPU時間 メモリなどです これは あるMetricKitペイロードを 人間が読めるように変換したものです これを見るとデータの集計方法が 大きく分けて 3種類あることが容易にわかります 累計 平均 および分類データです 処理後のこのデータは アプリケーションのビルド間での 不具合を特定するのに非常に有効です 難しい問題に取り組む上で ローカルのコンテクストと 組み合わせて使うこともできます ただし 一部の分野では 不具合の性質を完全に理解するのに 現在のメトリックが 不十分である可能性があります
よくある例を見てみましょう 起動性能データです ここでコールドランチの回数を 見ることができます つまり メモリ内に何もリソースがない ゼロの状態から起動された回数です 再開の数よりずっと多くなっています 典型的な性能のよいアプリケーションでは 再開の数の方が起動の数より ずっと多くなることが期待できます ここには何か不具合がありそうです もう一つのよくある例として 累計CPU時間があります 累計CPU時間が 累計前面表示時間よりも ずっと短くなっていることに ご注意ください これは良いことのように見えますが この稼働レベルが意味するのは 性能上の不具合なのか 向上なのか はっきりしません CPU時間はクロック周波数にも 影響されるからです デベロッパとしての本能としては これをもっと正確に数値化したいでしょう 現状ではそれは 単純な問題ではありません ここに明らかに発展の余地があります この問題をより深く探るには より詳細な情報が必要です 今年 MetricKit 2.0で いくつかの新しいメトリックの ご提供を開始します こういった よくある問題例を より深く掘り下げることを支援する意図です 私たちのチームではメトリックの サブセットを拡張するために努力しました アプリケーションの負荷 性能 および安定性について より明快なものとするためです その中にはCPU命令数 スクロールヒッチ アプリケーションからの退出回数が含まれます 最初にCPU命令数について 確認しましょう MetricKitでCPU命令数が MXCPUMetricクラスに新しく追加されました このメトリックは アプリケーションが発した― 1日の累計命令数をまとめたものです CPU命令数はCPUを使って アプリケーションが行った 作業の絶対的なメトリックです それはハードウェアや周波数の どちらにも依存しません これでアプリケーションの 合計負荷をより正確に 数量化することができます 次にスクロールヒッチについてです スクロールヒッチは今年提供を 開始する新しいメトリックです アプリケーションのグラフィック性能に 関する洞察を支援します スクロールヒッチとはスクロール中に レンダリングされたフレームが 期待された時間内に画面上に出てこない場合に カウントされます これは通常フレーム落ちの原因となり 動作のスムーズさが阻害されているのが ユーザーにも知覚できることになります MetricKitでは UIScrollViewsにおいて アプリケーションがスクロール中に ヒッチを起こして 消費した時間をご提供します
ヒッチの技術的詳細については スクロールヒッチとそれをXCTest メトリックで測定する方法を対象とした― 別のセッションを ご覧になることをお勧めします 最後ですが重要なこととして アプリケーション終了の理由を追加しました 今年 アプリケーションの終了と 強制終了に関するメトリックを提供します 前面とバックグランド両方について アプリケーションが終了した際の 理由と回数について 1日のまとめを受け取ることができます これはアプリケーションの起動と バックグラウンド実行フレームワークに伴う― よくある問題を 追跡するのに有用であると考えられます これらのメトリックを利用して 最良の実践を実装する方法に関する より詳細については 今年のアプリケーション終了に関するセッション “Why did my app get killed?”を ご覧になることをお勧めします 以上が今年の新しい メトリックです これらのメトリックを利用すると MetricKitデータを使って不具合を 探すにあたってより高い確実性が 得られるものと考えています それではメトリックペイロードに戻って 何が起きているかまだ判断できない― ある分野に焦点を当てて 詳細を見てみましょう アプリケーションハングヒストグラムに 注意すべきデータエントリが見られます これはユーザーの体験を深刻に 妨害している可能性があります 現在これは明らかに不具合です しかしメトリックだけでは根本原因を 特定できません 何が起きたか判断するためには ハングした時点での後方追跡など 追加の診断データが必要です そこで今年のMetricKitのもう一つの 重要な新機能です それは不具合の別のクラスについて 原因の発見を支援します MetricKit診断です MetricKit 2.0は新しいインターフェイスを 提供します 目的とする診断情報に アクセスできるようにするものです 診断情報は様々なタイプの 不具合について対処可能です ハング クラッシュ ディスク書き込み例外処理 およびCPU例外処理です
MetricKit 2.0で 診断を受け取り始めるためには 新しいMetricManagerSubscriber プロトコルメソッドを実装するだけで済みます それだけです この新しいプロトコルは昨年の didReceiveメトリックペイロード デリゲートメソッドとほとんど同じ外見です そして私たちの予測では ほとんどの場合 MetricKitのために構築済みの パイプラインがそのまま使えます そして このプロトコルは 見た目が同じだけではありません 機能としても同じです 意味的に言えば MetricKit診断機能は MetricKitメトリックとほとんど一緒です 少し前からのタイムラインを 見直してみましょう アプリケーションが1日使用されると MetricKitシステムは メトリックに加えて 使用中に発生した不具合について 診断情報を受動的に収集します システムはそれらをまとめて 1日の並行診断ペイロードとして 日常のメトリックペイロードに 加えて使用できるようにします ハングのような不具合が メトリックにあった場合 関連する診断ペイロードが存在すれば 参照できるようになりました 診断ペイロードはメトリックペイロードと 同時に受け取れます この診断ペイロードは 付随するメトリックペイロードと効果的に 1対1で対応できるようになっています それでは議論の方向を変えてこの新しい インターフェイスを詳しく見てみましょう そしてその能力に慣れましょう 新しい診断インターフェイスは 古いメトリック インターフェイスをミラーリングしています 少数の新しい基本クラスに関して MXDiagnosticはすべての診断の 継承元となる基本クラスです MXDiagnosticPayloadは 1日の終わりにすべての診断を 届ける搬送用クラスです MXCallStackTreeは 新しいデータクラスで不具合が発生した時 後方追跡をデバイス外で使えるよう― カプセル化します MXDiagnosticsはMXDiagnosticPayloadsに 包含されていて 不具合が発生した際の アプリケーションのメタデータを含みます 例えば具体的なビルドバージョンや 診断特有のデータです
診断特有のデータは 今年提供を始めるもので 各診断サブクラスのための 特有のデータサブセットです それらすべてに一貫しているのが MXCallStackTreeです
MXCallStackTreeは 新しく提供を始めるデータクラスで 不具合が発生した際の 後方追跡をカプセル化したものです これらの後方追跡はシンボル化されておらず デバイス外で処理するために設計されています そして不具合の本質を診断して 取り出せるように 豊富な情報のセットが 提供されるようになります
これはこの呼出スタックツリーを 人が読めるような JSONに変換すると どのように見えるかという例です 個々のフレームをATOSのようなツールで シンボル化するために 必要なすべての情報があります そこにはUUID オフセットおよび名称 さらにフレームアドレスなどの バイナリ情報も含まれます
これらの新しい呼出スタックツリーデータ構造は 移植可能性が高く 今年ご提供する他の性能ツールでも 使用されています より詳細については 新しい電力および性能APIに関する― セッションをご覧になることをお勧めします 前にご説明したように 今年 4つの新しい MXDiagnosticをお届けします ハング CPU例外処理 ディスク書き込み例外処理 およびクラッシュです これらの新しい診断サブクラスの それぞれに含まれる― 独自のデータについて 見ていきましょう まずはハングです ハングとはユーザーの入力に対して アプリケーションからの反応が 長期間にわたってなくなる不具合です アプリケーションの主スレッドが ブロックされるかビジー状態になるのが原因です ハングの診断用に MetricKitは 今後 アプリケーションの 主スレッドが無反応になった時間と 主スレッドの後方追跡を提供します 次はCPU例外処理です またはXcode Organizerで エネルギーログと呼ばれるものです これらの診断には 使用されたCPU時間 高いCPU使用率が サンプリングされた合計時間 そしてCPUを使用した スレッドの後方追跡が含まれます CPU例外処理診断は Metricペイロードと一緒に使用することで 再現が簡単ではないかもしれない不具合を 特定する上で非常に有用です 次にディスク書き込みです ディスク書き込み例外処理診断は CPU例外処理診断と おおよそ同様です それぞれの診断には 例外処理の 原因となった書き込みの総合計数と 過度の書き込みの原因となっている― スレッドの後方追跡が含まれます これらの診断は 1日あたり1ギガバイトという― しきい値をアプリケーションが 超えた場合に生成されます 最後ですが重要なものとして クラッシュ診断があります 今年 MetricKitがアプリケーションの クラッシュに関する診断を提供できることは すばらしいことです アプリケーションがクラッシュするたびに アクセス不良による クラッシュの場合には 例外処理情報 強制終了理由 バーチャルメモリ領域情報を含む MXCrashDiagnosticと 後方追跡がMetricKit診断インターフェイスを 通じて提供されます これがMetricKit診断の最後の項目です リアルな顧客の利用例における 不具合の根本原因を特定するための 強力な新しいツールです 本日のお話をまとめましょう MetricKit 2.0には最適化の作業を 次のレベルに高めることができる 新機能が詰め込まれています 顧客とベータテスターに 発生する不具合をより深く 理解するために 新しいメトリックをご提供します また これらの状況で発生する 再現が難しい不具合を 捉えることができるように 対象を決めた診断情報を ご提供します 最後にこれらすべては 余計な作業をほとんどなしで利用可能です これらの新機能は 実装が簡単なインターフェイスや 既存のインターフェイスを通じて提供されます
今年は大量のすばらしい 新機能があります そして役に立つ古い機能も ぜひご確認いただくことをお勧めします ご覧いただきありがとうございます 引き続き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. } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。