Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
モニタリングでパフォーマンス改善入門
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
AsamiShimizu
December 26, 2023
Programming
1.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
モニタリングでパフォーマンス改善入門
DroidKaigi 2023発表内容です
AsamiShimizu
December 26, 2023
More Decks by AsamiShimizu
See All by AsamiShimizu
Jetpack Composeで自作vimp実装してみた
starmaine777
0
160
運用中アプリに ダークテーマを適用してみる
starmaine777
0
420
Other Decks in Programming
See All in Programming
アクセシビリティから考える情報設計
high_g_engineer
0
350
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
120
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
430
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
230
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
260
Intent as Code
shoppingjaws
4
670
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
140
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
490
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Security issues being discussed on Web Platforms
petamoriken
0
460
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
310
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
510
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
880
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
The Invisible Side of Design
smashingmag
301
52k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Transcript
モニタリングで パフォーマンス改善⼊⾨ Shimizu Asami
清⽔⿇美 −Shimizu Asami- 株式会社AppBrew所属 コスメアプリ”LIPS”のAndroid開発担当 本⽇はご聴講ありがとうございます!有益な情報をお 届けできるよう努めますのでよろしくお願いします!
01. 02. 03. 04. パフォーマンスの検査 パフォーマンスの改善とは パフォーマンスのモニタリング まとめ
パフォーマンスの改善とは 01.
こんなお困りありませんか? • アプリを作ったはいいが起動が重い • アプリを作ったはいいが動作が重 い、Viewがカクつく • バッテリー消費が激しすぎ どこをどうすればいいかわからない!
公式ドキュメントを読もう https://developer.android.com/topic/per formance/overview?hl=ja アプリパフォーマンスガイドがあります。 今回の発表はここの紹介をしていきます!
何からすればいい? 問題がおこっていることはわかっている →ではその問題がなにか、の把握が必要。 検査→改善を回す!
改善は⼀歩ずつ! 検査をする際は⼀度につき⼀つの領域に集中したほうが いい • アプリ起動 • Viewレンダリング(ジャンク) • 画⾯遷移、ナビゲーション移動(Activity起動等) •
⻑時間実⾏、 • I/O、ネットワーキング等のバックグラウンド処理
⽤語解説 ジャンク • Viewのレンダリングが遅すぎてフレームをス キップしてしまうこと(1秒60フレームが理想) • フリーズ,ANRもジャンクの⼀種
⽤語解説 フリーズ • レンダリングに700ミリ秒以上かかるUIフ レーム。 • ⼊⼒に1秒反応しなくなってしまう。
⽤語解説 ANR(Application Not Responding) • UIスレッドが⻑期間ブロックされて起こる ◦ ⼊⼒イベントに対する応答が5秒以上 • BroadcastReceiverの実⾏が10秒以上
• アプリケーション応答なしダイアログ表⽰
パフォーマンスの検査 02.
パフォーマンス検査の種類 パフォーマンスの検査は、3パターン • Passive(受け⾝検査) • Manual(⼿動検査) • Automated(⾃動テスト)
パフォーマンス検査の注意点 できる限り本番の環境に近づける • ✕ Emulator ◦ ホストPCの状態に左右される • ✕ debuggable=true(build.gradle)
◦ 便利ではあるが余分な機能が多く不安定
PassiveTest ‐ 受け⾝検査
PassiveTest - 受け⾝検査 アプリを動かしながらLogCatのログを確認するこ と
PassiveTest - 受け⾝検査 メリット • 何が起きているかわかる デメリット • どこで起こっているかの詳細はわからない
PassiveTestでわかるもの tag: Choreographer • FrameのSkip時(UIレンダリングが遅いとき)に表⽰ Choreographer com.example.performancesample I Skipped 42
frames! The application may be doing too much work on its main thread.
None
PassiveTestでわかるもの tag: ActivityManger • ANR ActivityManager system_server E ANR in
com.example.performancesample (com.example.performancesample/.MainActivity) PID: 4729 Reason: Input dispatching timed out (53dcb44 com.example.performancesample/com.example.performancesample.MainActivity (server) is not responding. Waited 5002ms for MotionEvent) Parent: com.example.performancesample/.MainActivity ErrorId: ce233c9f-5740-4f23-b9db-3327368d60ca Frozen: false
PassiveTestでわかるもの tag: ActivityTaskManger • Activity起動時の所要時間 ActivityTaskManager system_server I Displayed com.example.performancesample/.MainActivity:
+758ms
PassiveTestでわかるもの tag: OpenGLRenderer • mainThreadが700ms以上遅れる(=freeze 状態) OpenGLRenderer com.example.performancesample I Davey!
duration=1258ms; Flags=0, FrameTimelineVsyncId=1661510, IntendedVsync=9642633836262, Vsync=9642885158517, InputEventId=0, HandleInputStart=9642892361353, AnimationStart=9642892364061, PerformTraversalsStart=9642944791618, DrawStart=9642944943493, FrameDeadline=9642920872578, FrameInterval=9642892343644, FrameStartTime=16754817, SyncQueued=9643651549605, SyncStart=9643651594657, IssueDrawCommandsStart=9643651644189, SwapBuffers=9643871400513, FrameCompleted=9643892793692, DequeueBufferDuration=11875, QueueBufferDuration=163177, GpuCompleted=9643892793692, SwapBuffersCompleted=9643871867127, DisplayPresentTime=0, CommandSubmissionCompleted=9643871400513,
PassiveTestまとめ • LogCatでジャンク発⽣やActivity起動 時間がわかる • どこで起こっているかはわからない
ManualTest ‐ ⼿動検査
ManualTest - ⼿動検査 問題のデバッグをすること • 問題がいつ、どこで起こっているかを確認 ◦ CPU、Memory、Network、Energy • アプリの操作をSystemTraceファイル化して
情報をグラフィカルに表⽰できる
ManualTest - ⼿動検査 • Android9以上:Perfetto • Android StudioのProfiler profilableまたはdebuggableなアプリ で実⾏可能
Profilableアプリを作る Android Qから登場 AndroidManifest構成のうちの⼀つ Application直下に記載
Profilable • debuggable=trueでもOK ◦ debug絡みの不要機能が多い • profilable ◦ profile記録機能のみ! ※本番アプリに適⽤しないよう注意
Perfetto Perfetto • 上記WebSiteでSystemTraceファイル のレコーディング開始からViewerで 確認までできる! ◦ (※Android13はrecording⾮対応)
Perfetto • Linux kernelのtraceが可能 • Androidの⾃分のアプリのみでなく、 端末全体のProcessの確認が可能
AndroidStudio Profiler • AndroidStudioのToolのひとつ • Android5.0以降と互換性
AndroidStudio Profiler • adbで接続している場合にオンタイム で確認が可能。 ◦ ただし対象のアプリのProcessしか⾒られ ない。 • ジャンク表⽰がわかりやすい
Perfetto vs AndroidStudio Profiler https://hackernoon.com/comparing-perfetto-with-android-profiler
SystemTraceファイル • Perfetto,AndroidStudio Profilerで検 査したい操作を記録したファイル • Android9以上の端末で記録可能
SystemTraceのやり⽅ • 開発者向けオプション → システムトレースでト レースの記録orトレース記録のクイックタイル 表⽰ • トレース記録したものは端末にデータとして保 存されるので、なんらかの⽅法でPCに移動し
て、Viewerで表⽰する
None
Perfetto Viewer
PerfettoViewerを動かそう!
Perfetto Viewer 全体のCPU利⽤量、GPU Manager、Battery量等
Perfetto Viewer 下には動いているPackageが表⽰される Packageをタップすると詳細表⽰
Perfetto Viewer ピンチアウトで拡⼤ができます
Perfetto Viewer Eventを選択すると下のSliceに詳細が表⽰される
Perfetto Viewer Custom Logを⼊れることもできます(PhotoTestClick13) Text(text = index.toString(), modifier = Modifier.clickable
{ Trace.beginSection("PhotoTextClick $index") TimeUnit.SECONDS.sleep(5) Trace.endSection() } )
AndroidStudioProfiler Perfettoよりもジャンクフレームがわか りやすい(上部にまとまって表⽰され る)
21msで表⽰されてほしいが79msかかっている
• SystemTraceを⾏い、処理内部でか かる時間を確認する • Profilableアプリで確認する • 基本はPerfetto、ジャンクの確認は AndroidStudioProfilerが便利 ManualTestまとめ
AutomatedTest - ⾃動テスト
AutomatedTest - ⾃動テス ト ⾃動テストでパフォーマンスのスピード を集計が可能 →パフォーマンスの回帰テスト
AutomatedTest - ⾃動テス ト Macrobenchmark • 起動、複雑な操作、⽐較的⼤きな領域に対応するユー スケースのテスト Microbenchmark :
• ⼩さい領域、1関数のユースケースのテスト ◦ サンプルだとsort、bitmap作成等
None
Macrobenchmark • AGP 7.3.0以上、GradleVersion 7.4以 上 • InstrumentalTestのModuleとして追 加できる
Macrobenchmark • ⾃動で対象の処理のスピードを測る テスト • 最⼩時間、最⼤時間、平均時間がわ かる • SystemTraceファイル出⼒
AutomatedTestまとめ • ⾃動InstrumentalTestで処理スピー ドを測る • 繰り返し測っておくと悪化コードが 追加されたときにすぐに判明できる
パフォーマンス検査まとめ • 検査→改善を回すのは、⼀箇所ずつ! • 受け⾝検査はざっくりと事象の確認ができる • ⼿動検査は具体的な問題の箇所が確認がしやす い • ⾃動テストは改善後に維持ができているかの
チェック
パフォーマンスのモニタリング 02.
モニタリング 継続的にパフォーマンスを監視すること で潜在的問題を早めに発⾒し、多くの ユーザーに問題を与える前に修正しよ う!
モニタリングの種類 • Android Vitals • Firebase Performance Monitoring • JankStats
• Benchmarkの継続的インテグレー ションでの実⾏
Android Vitals
Android Vitals • Google Play Consoleで確認可能 • 品質情報のログがGooglePlayに より⾃動で収集される ◦
安定性 ◦ パフォーマンス指標 ◦ バッテリー使⽤量 ◦ 権限拒否
Android Vitals 様々な指標の中でも、以下の主な指標2つ を重視。 • ユーザーが認識したクラッシュ発⽣率 • ユーザーが認識したANR発⽣率
Android Vitals 2つの指標がしきい値を超えて悪化すると…? • GooglePlay上でユーザーから⾒えづらくな る(アプリ表⽰が間引かれる?) • 適切に機能しない可能性がある警告が表⽰ される
れっつ実例! special thanks 夫(夫個⼈Project寄り拝借)
主な指標。⾃分のアプリのクラッシュ率としきい値も表⽰される
安定性、スタートアップ時間。類似アプリの中央値との⽐較もしやすい。
UIの他、権限拒否率まで⾒られます。
主な指標のANR発⽣詳細。折れ線グラフで確認可能。
ANR発⽣のAndroidVersion等
ANRの詳細。
バージョン等の情報も⾒られます
ANRのStackTraceも⾒られます
Android Vitalsは • CrashlyticsのSDKでは取得できないイベ ントをキャプチャできる ◦ SDK初期化よりも前に発⽣した起動時のCrash ◦ Android12以前のANR Android
Vitals vs Crashlytics
Android Vitalsは • GooglePlayからInstallされたアプリ のみ • Google認定デバイス上のもののみ Android Vitals vs
Crashlytics
Android Vitalsは • 使⽤状況および診断情報の共有をオプトインし たユーザーの情報のみ • ユーザープライバシー保護のため、匿名化され たレポートの作成に⼗分なデータを収集できた 場合にのみ Android
Vitals vs Crashlytics
Android VitalsとCrashlyticsで問題発⽣率の計算⽅法が異なる場 合がある ex)あるユーザーが1⽇3回アプリを利⽤し、1回クラッシュ • Android Vitals 1⽇のアクティブユーザーごとなので100% • Crashlyticsはセッションごとなので33%
Android Vitals vs Crashlytics
Android Vitals ゲーム系だと、Android Performance Tunerという pluginを⼊れると、フレームレート、読込み時間、 設定等の詳細パフォーマンスの情報も取れるらしい (対象がNativeGame(CおよびC++)またはUnity で利⽤可能
Android Vitals まとめ • GooglePlayStoreでリリースしたアプ リのCrash等の情報が取得可能 • 数値が悪すぎるとPlayStoreでの扱い が悪くなるので注意
Firebase Performance Monitoring
Firebase Performance Monitoring • Firebaseのサービスの⼀部。 • SDKをいれると⾃動計測してくれる ◦ HTTPネットワーク ◦
アプリ起動 ◦ Activity/Fragmentのフリーズ情報
実際の画⾯
カスタムで⾒たい指標の推移グラフが⾒える
ネットワークのResponseの時間
処理にどれだけの時間がかかったか
画⾯レンダリング情報
ネットワークとトレースは詳細も
さらに匿名化されたピックアップ情報も
下には処理の所要時間、ネットワーク時間も
• SDKを⼊れると⾃動で計測 • ネットワークやメソッドの所要時間 がわかるほか、サンプル抽出された セッション詳細も⾒られる FirebasePerfomanceMoni toringまとめ
JankStats
https://developer.android.com/topic/per formance/jankstats?hl=ja androix library(※α版) フレーム統計情報に関するレポートを⽤意 JankStats
JankStats Windowオブジェクトを監視し、 Listenerに情報を送る Frameの更新ごとに情報が送られる
JankStatsの内容 • フレームの開始時間 • 持続時間 • フレームをジャンクと⾒なすかどう か
ログ内容 FrameData( frameStartNanos=155698764771, frameDurationUiNanos=441821978, frameDurationCpuNanos=449129115, frameDurationTotalNanos=449769688, frameOverrunNanos=179341377, isJank=false, )
JankStats state 独⾃stateを追加可能。 if (listScrollState.isScrollInProgress){ performanceStateHolder.state?.putState(IS_SCROLLING, "true") } else {
performanceStateHolder.state?.removeState(IS_SCROLLING) }
JankStats state stateは複数キー追加可能 同じキーだと上書きされる
JankStatsまとめ • frameのレンダリング時間測定 • stateを適宜追加しジャンクの起こっ ている状態を確認、ログ等を送るこ とが可能
Benchmarkの 継続的インテグレーション実⾏
Benchmarkのインテグレー ションテスト 先述のBenchmark TestをFirebase Test Lab等で継続的に実⾏ →時間測定値の差分を監視することで 悪化をキャッチする
Benchmarkのインテグレー ションテスト Firebase Test Lab x Github Actionsでの 実⾏は公式サンプルがある https://github.com/android/performa
nce-samples/tree/main/Macrobench markSample/ftl
まとめ 04.
まとめ • パフォーマンス改善は⼀箇所ずつ • 本番に近いアプリで調査する • 調査→修正を繰り返す • モニタリングで悪化箇所をチェック