Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践

Avatar for GOTO-TSL GOTO-TSL
November 12, 2025

Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践

FlutterKaigi 2025@Otemachi PLACE HALL & CONFERENCE
ASSIGN Hall 11:30~

Avatar for GOTO-TSL

GOTO-TSL

November 12, 2025
Tweet

More Decks by GOTO-TSL

Other Decks in Technology

Transcript

  1. 自己紹介 • 名前:Kosuke Goto • 所属:スタディプラス株式会社(2023年新卒入社) • Flutter歴:3年 ◦ FlutterKaigi

    2024 ▪ 気をつけたい!Desktop対応で陥りやすい罠とその対策 ▪ https://2024.flutterkaigi.jp/session/6cda6895-57f8-47dc-ab 29-ebcbd9c7f95a 2
  2. Flutter DevTools パフォーマンス分析やデバッグのためのツールを提供 - Flutter Inspector - Performance - Memory

    - Network - CPU Profiler - etc.. →デバッグの機能しか使ったことないなあ... 6
  3. 問題となっていた状態の監視 51 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 状態を更新 下タブ RiverpodのNotifierProvider state:

    ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
  4. 問題となっていた実装(タブ2画面での例) 54 class RecordPage extends HookConsumerWidget { const RecordPage({super.key}); @override

    Widget build(BuildContext context, WidgetRef ref) { final hasSeenOnboardingMessage = ref.watch(sharedPreferencesPresenterProvider).hasSeenOnboardingMessage; … } } 巨大クラスを公開するRiverpodのProvider
  5. 問題となっていた実装(タブ2画面での例) 55 class RecordPage extends HookConsumerWidget { const RecordPage({super.key}); @override

    Widget build(BuildContext context, WidgetRef ref) { final hasSeenOnboardingMessage = ref.watch(sharedPreferencesPresenterProvider).hasSeenOnboardingMessage; … } } これだとどのプロパティが更新されてもbuildが発火する
  6. 改善後の状態監視 57 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 状態を更新 下タブ RiverpodのNotifierProvider state:

    ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
  7. 事例①のまとめ - アプリが全体的に「重い」、「カクつく」 との問い合わせ - FrameのJank(カクつき)を検知するためPerformance viewを確認 - Frame chart

    → Frame Analysis → Timeline Events(Enhance Tracing)と見てい くことで不要なbuildが呼ばれている ことを発見 - RiverpodのProviderをwatchする際は適切に 63
  8. 原因の判明 Flutter DevToolsの調査に行き詰まる ↓ チームメンバーが「画像キャッシュが怪しいのでは?」と仮説を立てる 76 Image.network( item.materialImageUrl , );

    Image.network( item.materialImageUrl , cacheWidth: cacheSize, cacheHeight: cacheSize, ); キャッシュサイズを指定するように変更
  9. ①全体的なパフォーマンス問題の検知 88 機能・オプション名 タブ できること Performance Overlay (Frame chart) Performance

    カクつき(UI Jank)の箇所をざっくり把握できる Highlights Repaints Inspector 不要な再描画を検知できる Count widget builds Performance 不要なbuildを検知できる Highlight Oversized Images ※ Inspector 画像サイズ過大を検知できる ※事例②で紹介したので説明は省略
  10. ②特定画面や機能の深掘り 93 機能・オプション名 タブ できること Frame Analysis Timeline Events Enhance

    Tracing ※ Performance カクつき(UI Jank)のボトルネック特定 Diff Snapshots Memory メモリリークしている箇所の特定 CPU Profiler CPU Profiler 時間がかかっている処理の特定 ※事例①で紹介したので説明は省略
  11. 参考文献 Flutter Docs - https://docs.flutter.dev/tools/devtools - https://docs.flutter.dev/perf Flutter DevTools Tutorial(Medium)

    - https://medium.com/@fluttergems/mastering-dart-flutter-devtools-part-1-introd uction-installation-4f703a8cfcc8 101