Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践
Search
GOTO-TSL
November 12, 2025
Technology
1
1.3k
Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践
FlutterKaigi 2025@Otemachi PLACE HALL & CONFERENCE
ASSIGN Hall 11:30~
GOTO-TSL
November 12, 2025
Tweet
Share
More Decks by GOTO-TSL
See All by GOTO-TSL
気をつけたい!Desktop対応で陥りやすい罠とその対策
goto_tsl
0
1.3k
Other Decks in Technology
See All in Technology
【AWS re:Invent 2025速報】AIビルダー向けアップデートをまとめて解説!
minorun365
4
470
日本Rubyの会の構造と実行とあと何か / hokurikurk01
takahashim
4
940
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
180
学習データって増やせばいいんですか?
ftakahashi
1
250
最近のLinux普段づかいWaylandデスクトップ元年
penguin2716
1
670
グレートファイアウォールを自宅に建てよう
ctes091x
0
140
RAG/Agent開発のアップデートまとめ
taka0709
0
140
Uncertainty in the LLM era - Science, more than scale
gaelvaroquaux
0
810
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
4
990
AWS CLIの新しい認証情報設定方法aws loginコマンドの実態
wkm2
5
560
AWS Bedrock AgentCoreで作る 1on1支援AIエージェント 〜Memory × Evaluationsによる実践開発〜
yusukeshimizu
6
370
re:Invent 2025 ふりかえり 生成AI版
takaakikakei
1
180
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
Building Flexible Design Systems
yeseniaperezcruz
330
39k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
121
20k
Music & Morning Musume
bryan
46
7k
Code Review Best Practice
trishagee
74
19k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Embracing the Ebb and Flow
colly
88
4.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Transcript
Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践 FlutterKaigi 2025@Otemachi PLACE HALL & CONFERENCE ASSIGN
Hall 11:30~ 後藤 孝輔
自己紹介 • 名前:Kosuke Goto • 所属:スタディプラス株式会社(2023年新卒入社) • Flutter歴:3年 ◦ FlutterKaigi
2024 ▪ 気をつけたい!Desktop対応で陥りやすい罠とその対策 ▪ https://2024.flutterkaigi.jp/session/6cda6895-57f8-47dc-ab 29-ebcbd9c7f95a 2
Flutter DevTools 3
Flutter DevToolsを使ったことがある方🙋 4
Flutter DevTools 5
Flutter DevTools パフォーマンス分析やデバッグのためのツールを提供 - Flutter Inspector - Performance - Memory
- Network - CPU Profiler - etc.. →デバッグの機能しか使ったことないなあ... 6
きっかけとなる出来事 本番アプリでパフォーマンス問題が発生💥 →Flutter DevToolsを使った調査 パフォーマンス分析における使い方、便利な機能など色々な発見があった 7
この発表について - 事例の中でFlutter DevToolsをどのように活用できたかを話します - 皆さんがFlutter DevToolsを活用して改善を行うきっかけになればと思います 8
今日話すこと - パフォーマンス改善事例① - パフォーマンス改善事例② - 状況別に使える Flutter DevTools活用ガイド -
まとめ 9
Studyplusについて - 学習を記録して管理、シェアできるアプリ - 数十万人規模のユーザーが日常的に利用 - iOS/Android/Webで提供 - 今年の3月末にフルFlutter化 10
今日話すこと - パフォーマンス改善事例① - パフォーマンス改善事例② - 状況別に使える Flutter DevTools活用ガイド -
まとめ 11
事例①の概要 12 ユーザーからのお問合せ 調査 原因の判明 改善 • Flutter版iOSアプリをリリース直後アプリ が「重い」「カクカクする」というお問い合わ せが届く
• SNS、ストアレビューにも同様の投稿あり
事例①の概要 13 ユーザーからのお問合せ 調査 原因の判明 改善 • 手元での再現確認 • ソースコードを確認
→有力な手がかりなし • Flutter DevToolsを使った調査
事例①の概要 14 ユーザーからのお問合せ 調査 原因の判明 改善 • 状態監視の方法に問題 があり、不要な buildが発生してしまっていた
事例①の概要 15 ユーザーからのお問合せ 調査 原因の判明 改善 • 不要なbuildの発生を防ぐ ようにソース コードを修正
• 修正によりパフォーマンスが改善
Flutter DevTools起動 17 ※Android Studioの場合
Flutter DevTools起動 18 ※Android Studioの場合 ブラウザで起動 Android Studio内で起動
Flutter DevToolsを起動 19
Flutter DevToolsを起動 20 →パフォーマンスを正確に測定するためにはアプリをProfileモードで実行してね
Flutter DevToolsを起動 22 アプリをProfileモードで実行
Performance view 23
Performance view 24
Frameチャートの見方 25 UI - Dartコードの実行 - Widgetの build/layout/paint(準備) Raster -
GPUと通信してピクセルを画面に描 画する部分
Frameチャートの見方 26 ✅約16ms※のラインを超えている場合、赤い色で表示される →Jank(カクつき)が発生している ※1(s) ÷ 60(frame) = 0.0166666…(s) ≒
16.7ms
実際に見てみる 27
タブを切り替えた時にJank(カクつき)が発生している 28
Frameをクリックして詳細を見る 29 2 1 3 4 5
Frameをクリックして詳細を見る 30
Frame Analysisで詳細を確認する 31
Frame Analysisで詳細を確認する 32 build/layout/paint時間の内訳
Frame Analysisで詳細を確認する 33 buildに時間がかかっている📝
Timeline Eventsで詳細を確認する 34
Timeline Eventsで詳細を確認する 36
Timeline Eventsで詳細を確認する 37 👈 uiと書かれたところを見にいく
Timeline Eventsで詳細を確認する 38
Timeline Eventsで詳細を確認する 40 ここから何がわかるんだ...?
Enhance Tracing 41
Enhance Tracing 42 ✅TimelineにWidgetのbuild情報が追加されるようになる
Frame Analysisのヒント 43 デバッグのヒントとなるテキスト💡
Trace widget buildsを有効にすると 46
Trace widget buildsを有効にすると 47 タブ2の画面 タブ4の画面 タブ3の画面 タブ1→タブ2への切り替えなのに、関係のない画面がbuildされている
Flutter DevToolsでの調査でわかったこと - タブを切り替えた時にカクつきが発生 - 該当のフレームではbuildに時間がかかっていた - その原因は不要なbuildが呼ばれていたこと →この情報を元にコードを確認 48
事例①の概要 49 ユーザーからのお問合せ 調査 原因の判明 改善 • 状態監視の方法に問題 があることが判 明
• 不要なrebuildが発生してしまっていた
問題となっていた状態の監視 50 RiverpodのNotifierProvider state: ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ) タブ1の画面 タブ2の画面 タブ3の画面
タブ4の画面 状態の変更を監視
問題となっていた状態の監視 51 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 状態を更新 下タブ RiverpodのNotifierProvider state:
ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
問題となっていた状態の監視 52 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 状態の変更が通知 下タブ RiverpodのNotifierProvider state:
ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
問題となっていた状態の監視 53 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 一斉にbuildメソッドが呼ばれる 下タブ RiverpodのNotifierProvider state:
ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
問題となっていた実装(タブ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
問題となっていた実装(タブ2画面での例) 55 class RecordPage extends HookConsumerWidget { const RecordPage({super.key}); @override
Widget build(BuildContext context, WidgetRef ref) { final hasSeenOnboardingMessage = ref.watch(sharedPreferencesPresenterProvider).hasSeenOnboardingMessage; … } } これだとどのプロパティが更新されてもbuildが発火する
改善:watchを局所化する(.select) Riverpodのselectで必要なプロパティだけ監視 56 final hasSeenOnboardingMessage = ref.watch(sharedPreferencesPresenterProvider).hasSeenOnboardingMessage; before final hasSeenOnboardingMessage
= ref.watch( sharedPreferencesPresenterProvider.select( (prefs) => prefs.hasSeenOnboardingMessage, ), ); after
改善後の状態監視 57 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 状態を更新 下タブ RiverpodのNotifierProvider state:
ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
改善後の状態監視 58 タブ1の画面 タブ2の画面 タブ3の画面 タブ4の画面 関係のないプロパティの変更ではbuildが呼ばれない👍 下タブ RiverpodのNotifierProvider state:
ローカルキャッシュに保存するデータクラス (ユーザー設定など全 54プロパティ)
改善後の確認(Frameチャート) 59
改善後の確認(Frame Analysis) 60
改善後の確認(Timeline Events) 61
改善後の確認(Timeline Events) 62 before after
事例①のまとめ - アプリが全体的に「重い」、「カクつく」 との問い合わせ - FrameのJank(カクつき)を検知するためPerformance viewを確認 - Frame chart
→ Frame Analysis → Timeline Events(Enhance Tracing)と見てい くことで不要なbuildが呼ばれている ことを発見 - RiverpodのProviderをwatchする際は適切に 63
今日話すこと - パフォーマンス改善事例① - パフォーマンス改善事例② - 状況別に使える Flutter DevTools活用ガイド -
まとめ 64
事例②の概要 65 ユーザーからのお問合せ 調査 原因(仮説) 改善 • 特定のユーザーからお問い合わせ ◦ 本棚画面※でアプリが落ちる
◦ 本棚画面をしばらく触ると落ちる ※本棚は教材画像が並ぶ このような画面👉
事例②の概要 66 ユーザーからのお問合せ 調査 原因(仮説) 改善 • 手元での再現確認 ◦ 手元では再現しない
• ソースコードを確認 • Flutter DevToolsでの調査
事例②の概要 68 ユーザーからのお問合せ 調査 原因(仮説) 改善 • サーバーから取得する画像のサイズが非 常に大きく、それをアプリ側でサイズ指定 せずにキャッシュとして持っていることが
問題?
事例②の概要 69 ユーザーからのお問合せ 調査 原因(仮説) 改善 • キャッシュサイズを指定 • 問い合わせのあったユーザーから改善さ
れたと連絡をもらった
Flutter DevToolsでの調査 本棚画面でアプリが落ちる - UIスレッドの処理負荷が高い? - メモリリークやメモリ膨張の可能性? →本棚画面を中心にPerformance view, Memory
viewを見る 70
Performance view 71 特に異常は見られなかった
Memory view 72
Memory chart 73 Dart/Flutterのヒープメモリと一部ネイティブメモリの状態を 時間経過とともに視覚的に表示
Memory chart 74 メモリリークしているかどうか ✅GCイベントの後もDart/Flutterのヒープメモリが 継続的に増加し続けるかどうかをみる
Memory view 75 GCイベントの前後を比較して見たが、大きく増えているなどはなかった
原因の判明 Flutter DevToolsの調査に行き詰まる ↓ チームメンバーが「画像キャッシュが怪しいのでは?」と仮説を立てる 76 Image.network( item.materialImageUrl , );
Image.network( item.materialImageUrl , cacheWidth: cacheSize, cacheHeight: cacheSize, ); キャッシュサイズを指定するように変更
修正後のリリースで解消 - アプリが落ちることなく使えるようになったとの報告を受けた 77 考えられる原因 - 該当ユーザーの登録している画像のサイズが極端に大きかった - その画像をそのままのサイズでキャッシュとして持っていた →メモリ圧迫でアプリが落ちていた
なぜFlutter DevToolsでは分からなかったのか? ①該当ユーザーと同じ環境での検証ができていなかった - 検証アカウントの教材画像サイズ<<<<該当ユーザーの教材画像サイズ ②画像キャッシュはMemory Viewの可視化する領域外で膨張していた?(仮説) 78 →Flutter DevToolsを使って検知できないのか?
Highlight Oversized Images - Flutter Inspectorのデバッグオプションの一つ - 必要以上に大きなメモリを使用している画像を検出できる 79
Highlight Oversized Images 80 debugモードで実行 ↓ Flutter Inspectorを起動
Highlight Oversized Images 81 これをONにする
Highlight Oversized Images 82 ✅必要とされるメモリよりも128 KB以上多くメモリを消費している画像→色、 上下反転画像として表示される
Highlight Oversized Images 83 改善前の状態で確認すると、確かに右のような状態になっていた
事例②のまとめ - 特定のユーザーから本棚画面でアプリが落ちる とのお問い合わせ - Performance, Memory viewを確認するも問題を検知できず - 画像キャッシュサイズの指定
によって問題が解決 - 過度にメモリ消費している画像はHighlight Oversized Imagesオプションで検知 可能 84
今日話すこと - パフォーマンス改善事例① - パフォーマンス改善事例② - 状況別に使える Flutter DevTools活用ガイド -
まとめ 85
状況別に使えるFlutter DevTools活用ガイド - ①全体的なパフォーマンス問題の検知 - ②特定画面や機能の深掘り 86
状況別に使えるFlutter DevTools活用ガイド - ①全体的なパフォーマンス問題の検知 - ②特定画面や機能の深掘り 87
①全体的なパフォーマンス問題の検知 88 機能・オプション名 タブ できること Performance Overlay (Frame chart) Performance
カクつき(UI Jank)の箇所をざっくり把握できる Highlights Repaints Inspector 不要な再描画を検知できる Count widget builds Performance 不要なbuildを検知できる Highlight Oversized Images ※ Inspector 画像サイズ過大を検知できる ※事例②で紹介したので説明は省略
Performance Overlay Frame chartをアプリ上で確認できる →カクつき(UI Jank)の箇所をざっくり把握できる ✅見るポイント - max, avgが高くなる時
- バーが赤くなるとJank 89 ※Profileモードで利用
Highlight Repaints 再描画が起こるたびに境界値の色が変 わる →不要な再描画を検知できる ✅見るポイント - 再描画対象が固定領域まで及んで いないか -
不必要に再描画されていないか 90 ※Debugモードのみ
Count Widget builds 各フレームでbuildされたWidgetとその build回数がわかる →不要なbuildを検知できる ✅見るポイント - 関係のないWidgetがbuildされていな いか
- 同じWidgetが複数回buildされていな いか 91 ※Debugモードのみ
状況別に使えるFlutter DevTools活用ガイド - ①全体的なパフォーマンス問題の検知 - ②特定画面や機能の深掘り 92
②特定画面や機能の深掘り 93 機能・オプション名 タブ できること Frame Analysis Timeline Events Enhance
Tracing ※ Performance カクつき(UI Jank)のボトルネック特定 Diff Snapshots Memory メモリリークしている箇所の特定 CPU Profiler CPU Profiler 時間がかかっている処理の特定 ※事例①で紹介したので説明は省略
Diff Snapshots 94 Memory Snapshotを比較できる →メモリリークしている箇所を特定で きる
Diff Snapshots 96 ✅破棄されるべきインスタンスが残っていないか
CPU Profiler 97 アプリ実行中のCPU消費時間を記録・集計 →時間のかかっている処理を特定できる ✅見るポイント - Bottom UpタブのSelf Timeが高いメソッド
- Call TreeタブのTotal Timeが高いメソッド
CPU Profiler 98 アプリ実行中のCPU消費時間を記録・集計 →時間のかかっている処理を特定できる ✅見るポイント - Bottom UpタブのSelf Timeが高いメソッド
- Call TreeタブのTotal Timeが高いメソッド
今日話すこと - パフォーマンス改善事例① - パフォーマンス改善事例② - 状況別に使える Flutter DevTools活用ガイド -
まとめ 99
まとめ - 事例とともにFlutter DevTools活用の流れを見ていった - 事例①UIのカクつき→Performance viewで原因が特定できた - 事例②アプリが落ちる→Flutter Inspectorのdebugオプションで特定可能とわかった
- 状況別に使える機能について紹介した この発表がFlutter DevTools活用の参考になればと思います 100
参考文献 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