Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践
Search
GOTO-TSL
November 12, 2025
Technology
1
110
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
Snowflakeとdbtで加速する 「TVCMデータで価値を生む組織」への進化論 / Evolving TVCM Data Value in TELECY with Snowflake and dbt
carta_engineering
2
220
AI時代におけるドメイン駆動設計 入門 / Introduction to Domain-Driven Design in the AI Era
fendo181
0
600
AI-ready"のための"データ基盤 〜 LLMOpsで事業貢献するための基盤づくり
ismk
0
150
データ組織ゼロから投資を得るまでの軌跡と未来図 〜AIの前にやるべきこと〜 / Building a Data Organization from Scratch: The Journey to Securing Investment and a Vision for the Future
kaonavi
0
110
激動の2025年、Modern Data Stackの最新技術動向
sagara
0
1.2k
Sansan BIが実践する AI on BI とセマンティックレイヤー / data_summit_findy
sansan_randd
0
120
“それなりに”安全なWebアプリケーションの作り方
xryuseix
0
180
CodexでもAgent Skillsを使いたい
gotalab555
6
3.3k
最近読んで良かった本 / Yokohama North Meetup #10
mktakuya
0
1.3k
QAエンジニアがプロダクト専任で チームの中に入ると。。。?/登壇資料(杉森 太樹)
hacobu
PRO
0
160
こんな時代だからこそ! 想定しておきたいアクセスキー漏洩後のムーブ
takuyay0ne
4
490
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
6
2.3k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
9.1k
Statistics for Hackers
jakevdp
799
220k
Mobile First: as difficult as doing things right
swwweet
225
10k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Become a Pro
speakerdeck
PRO
29
5.6k
Into the Great Unknown - MozCon
thekraken
40
2.1k
Music & Morning Musume
bryan
46
6.9k
Six Lessons from altMBA
skipperchong
29
4.1k
Thoughts on Productivity
jonyablonski
73
4.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
We Have a Design System, Now What?
morganepeng
54
7.9k
RailsConf 2023
tenderlove
30
1.3k
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