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
モニタリングでパフォーマンス改善入門
Search
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
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
170
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
110
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
500
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
140
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
自作OSでスライド発表する
uyuki234
1
3.9k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
150
Foundation Models frameworkで画像分析
ryodeveloper
1
130
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
Featured
See All Featured
Practical Orchestrator
shlominoach
191
11k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
How to Ace a Technical Interview
jacobian
281
24k
エンジニアに許された特別な時間の終わり
watany
108
250k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
For a Future-Friendly Web
brad_frost
183
10k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Fireside Chat
paigeccino
42
4k
The World Runs on Bad Software
bkeepers
PRO
72
12k
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.
まとめ • パフォーマンス改善は⼀箇所ずつ • 本番に近いアプリで調査する • 調査→修正を繰り返す • モニタリングで悪化箇所をチェック