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.1k
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.2k
Other Decks in Technology
See All in Technology
その設計、 本当に価値を生んでますか?
shimomura
2
180
オープンデータの内製化から分かったGISデータを巡る行政の課題
naokim84
2
1.3k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
Security Diaries of an Open Source IAM
ahus1
0
110
Oracle Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
0
120
M5UnifiedとPicoRubyで楽しむM5シリーズ
kishima
0
110
知っていると得する!Movable Type 9 の新機能を徹底解説
masakah
0
200
Multimodal AI Driving Solutions to Societal Challenges
keio_smilab
PRO
1
120
AI駆動開発によるDDDの実践
dip_tech
PRO
0
290
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
9.9k
How native lazy objects will change Doctrine and Symfony forever
beberlei
1
380
MS Ignite 2025で発表されたFoundry IQをRecap
satodayo
3
230
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.4k
Designing for humans not robots
tammielis
254
26k
Designing for Performance
lara
610
69k
What's in a price? How to price your products and services
michaelherold
246
12k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
Thoughts on Productivity
jonyablonski
73
5k
How to Ace a Technical Interview
jacobian
280
24k
The Cult of Friendly URLs
andyhume
79
6.7k
Six Lessons from altMBA
skipperchong
29
4.1k
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