Slide 1

Slide 1 text

モニタリングで パフォーマンス改善⼊⾨ Shimizu Asami

Slide 2

Slide 2 text

清⽔⿇美 −Shimizu Asami- 株式会社AppBrew所属 コスメアプリ”LIPS”のAndroid開発担当 本⽇はご聴講ありがとうございます!有益な情報をお 届けできるよう努めますのでよろしくお願いします!

Slide 3

Slide 3 text

01. 02. 03. 04. パフォーマンスの検査 パフォーマンスの改善とは パフォーマンスのモニタリング まとめ

Slide 4

Slide 4 text

パフォーマンスの改善とは 01.

Slide 5

Slide 5 text

こんなお困りありませんか? ● アプリを作ったはいいが起動が重い ● アプリを作ったはいいが動作が重 い、Viewがカクつく ● バッテリー消費が激しすぎ どこをどうすればいいかわからない!

Slide 6

Slide 6 text

公式ドキュメントを読もう https://developer.android.com/topic/per formance/overview?hl=ja アプリパフォーマンスガイドがあります。 今回の発表はここの紹介をしていきます!

Slide 7

Slide 7 text

何からすればいい? 問題がおこっていることはわかっている →ではその問題がなにか、の把握が必要。 検査→改善を回す!

Slide 8

Slide 8 text

改善は⼀歩ずつ! 検査をする際は⼀度につき⼀つの領域に集中したほうが いい ● アプリ起動 ● Viewレンダリング(ジャンク) ● 画⾯遷移、ナビゲーション移動(Activity起動等) ● ⻑時間実⾏、 ● I/O、ネットワーキング等のバックグラウンド処理

Slide 9

Slide 9 text

⽤語解説 ジャンク ● Viewのレンダリングが遅すぎてフレームをス キップしてしまうこと(1秒60フレームが理想) ● フリーズ,ANRもジャンクの⼀種

Slide 10

Slide 10 text

⽤語解説 フリーズ ● レンダリングに700ミリ秒以上かかるUIフ レーム。 ● ⼊⼒に1秒反応しなくなってしまう。

Slide 11

Slide 11 text

⽤語解説 ANR(Application Not Responding) ● UIスレッドが⻑期間ブロックされて起こる ○ ⼊⼒イベントに対する応答が5秒以上 ● BroadcastReceiverの実⾏が10秒以上 ● アプリケーション応答なしダイアログ表⽰

Slide 12

Slide 12 text

パフォーマンスの検査 02.

Slide 13

Slide 13 text

パフォーマンス検査の種類 パフォーマンスの検査は、3パターン ● Passive(受け⾝検査) ● Manual(⼿動検査) ● Automated(⾃動テスト)

Slide 14

Slide 14 text

パフォーマンス検査の注意点 できる限り本番の環境に近づける ● ✕ Emulator ○ ホストPCの状態に左右される ● ✕ debuggable=true(build.gradle) ○ 便利ではあるが余分な機能が多く不安定

Slide 15

Slide 15 text

PassiveTest ‐ 受け⾝検査

Slide 16

Slide 16 text

PassiveTest - 受け⾝検査 アプリを動かしながらLogCatのログを確認するこ と

Slide 17

Slide 17 text

PassiveTest - 受け⾝検査 メリット ● 何が起きているかわかる デメリット ● どこで起こっているかの詳細はわからない

Slide 18

Slide 18 text

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.

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

PassiveTestでわかるもの tag: ActivityTaskManger ● Activity起動時の所要時間 ActivityTaskManager system_server I Displayed com.example.performancesample/.MainActivity: +758ms

Slide 22

Slide 22 text

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,

Slide 23

Slide 23 text

PassiveTestまとめ ● LogCatでジャンク発⽣やActivity起動 時間がわかる ● どこで起こっているかはわからない

Slide 24

Slide 24 text

ManualTest ‐ ⼿動検査

Slide 25

Slide 25 text

ManualTest - ⼿動検査 問題のデバッグをすること ● 問題がいつ、どこで起こっているかを確認 ○ CPU、Memory、Network、Energy ● アプリの操作をSystemTraceファイル化して 情報をグラフィカルに表⽰できる

Slide 26

Slide 26 text

ManualTest - ⼿動検査 ● Android9以上:Perfetto ● Android StudioのProfiler profilableまたはdebuggableなアプリ で実⾏可能

Slide 27

Slide 27 text

Profilableアプリを作る Android Qから登場 AndroidManifest構成のうちの⼀つ Application直下に記載

Slide 28

Slide 28 text

Profilable ● debuggable=trueでもOK ○ debug絡みの不要機能が多い ● profilable ○ profile記録機能のみ! ※本番アプリに適⽤しないよう注意

Slide 29

Slide 29 text

Perfetto Perfetto ● 上記WebSiteでSystemTraceファイル のレコーディング開始からViewerで 確認までできる! ○ (※Android13はrecording⾮対応)

Slide 30

Slide 30 text

Perfetto ● Linux kernelのtraceが可能 ● Androidの⾃分のアプリのみでなく、 端末全体のProcessの確認が可能

Slide 31

Slide 31 text

AndroidStudio Profiler ● AndroidStudioのToolのひとつ ● Android5.0以降と互換性

Slide 32

Slide 32 text

AndroidStudio Profiler ● adbで接続している場合にオンタイム で確認が可能。 ○ ただし対象のアプリのProcessしか⾒られ ない。 ● ジャンク表⽰がわかりやすい

Slide 33

Slide 33 text

Perfetto vs AndroidStudio Profiler https://hackernoon.com/comparing-perfetto-with-android-profiler

Slide 34

Slide 34 text

SystemTraceファイル ● Perfetto,AndroidStudio Profilerで検 査したい操作を記録したファイル ● Android9以上の端末で記録可能

Slide 35

Slide 35 text

SystemTraceのやり⽅ ● 開発者向けオプション → システムトレースでト レースの記録orトレース記録のクイックタイル 表⽰ ● トレース記録したものは端末にデータとして保 存されるので、なんらかの⽅法でPCに移動し て、Viewerで表⽰する

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

Perfetto Viewer

Slide 38

Slide 38 text

PerfettoViewerを動かそう!

Slide 39

Slide 39 text

Perfetto Viewer 全体のCPU利⽤量、GPU Manager、Battery量等

Slide 40

Slide 40 text

Perfetto Viewer 下には動いているPackageが表⽰される Packageをタップすると詳細表⽰

Slide 41

Slide 41 text

Perfetto Viewer ピンチアウトで拡⼤ができます

Slide 42

Slide 42 text

Perfetto Viewer Eventを選択すると下のSliceに詳細が表⽰される

Slide 43

Slide 43 text

Perfetto Viewer Custom Logを⼊れることもできます(PhotoTestClick13) Text(text = index.toString(), modifier = Modifier.clickable { Trace.beginSection("PhotoTextClick $index") TimeUnit.SECONDS.sleep(5) Trace.endSection() } )

Slide 44

Slide 44 text

AndroidStudioProfiler Perfettoよりもジャンクフレームがわか りやすい(上部にまとまって表⽰され る)

Slide 45

Slide 45 text

21msで表⽰されてほしいが79msかかっている

Slide 46

Slide 46 text

● SystemTraceを⾏い、処理内部でか かる時間を確認する ● Profilableアプリで確認する ● 基本はPerfetto、ジャンクの確認は AndroidStudioProfilerが便利 ManualTestまとめ

Slide 47

Slide 47 text

AutomatedTest - ⾃動テスト

Slide 48

Slide 48 text

AutomatedTest - ⾃動テス ト ⾃動テストでパフォーマンスのスピード を集計が可能 →パフォーマンスの回帰テスト

Slide 49

Slide 49 text

AutomatedTest - ⾃動テス ト Macrobenchmark ● 起動、複雑な操作、⽐較的⼤きな領域に対応するユー スケースのテスト Microbenchmark : ● ⼩さい領域、1関数のユースケースのテスト ○ サンプルだとsort、bitmap作成等

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

Macrobenchmark ● AGP 7.3.0以上、GradleVersion 7.4以 上 ● InstrumentalTestのModuleとして追 加できる

Slide 52

Slide 52 text

Macrobenchmark ● ⾃動で対象の処理のスピードを測る テスト ● 最⼩時間、最⼤時間、平均時間がわ かる ● SystemTraceファイル出⼒

Slide 53

Slide 53 text

AutomatedTestまとめ ● ⾃動InstrumentalTestで処理スピー ドを測る ● 繰り返し測っておくと悪化コードが 追加されたときにすぐに判明できる

Slide 54

Slide 54 text

パフォーマンス検査まとめ ● 検査→改善を回すのは、⼀箇所ずつ! ● 受け⾝検査はざっくりと事象の確認ができる ● ⼿動検査は具体的な問題の箇所が確認がしやす い ● ⾃動テストは改善後に維持ができているかの チェック

Slide 55

Slide 55 text

パフォーマンスのモニタリング 02.

Slide 56

Slide 56 text

モニタリング 継続的にパフォーマンスを監視すること で潜在的問題を早めに発⾒し、多くの ユーザーに問題を与える前に修正しよ う!

Slide 57

Slide 57 text

モニタリングの種類 ● Android Vitals ● Firebase Performance Monitoring ● JankStats ● Benchmarkの継続的インテグレー ションでの実⾏

Slide 58

Slide 58 text

Android Vitals

Slide 59

Slide 59 text

Android Vitals ● Google Play Consoleで確認可能 ● 品質情報のログがGooglePlayに より⾃動で収集される ○ 安定性 ○ パフォーマンス指標 ○ バッテリー使⽤量 ○ 権限拒否

Slide 60

Slide 60 text

Android Vitals 様々な指標の中でも、以下の主な指標2つ を重視。 ● ユーザーが認識したクラッシュ発⽣率 ● ユーザーが認識したANR発⽣率

Slide 61

Slide 61 text

Android Vitals 2つの指標がしきい値を超えて悪化すると…? ● GooglePlay上でユーザーから⾒えづらくな る(アプリ表⽰が間引かれる?) ● 適切に機能しない可能性がある警告が表⽰ される

Slide 62

Slide 62 text

れっつ実例! special thanks 夫(夫個⼈Project寄り拝借)

Slide 63

Slide 63 text

主な指標。⾃分のアプリのクラッシュ率としきい値も表⽰される

Slide 64

Slide 64 text

安定性、スタートアップ時間。類似アプリの中央値との⽐較もしやすい。

Slide 65

Slide 65 text

UIの他、権限拒否率まで⾒られます。

Slide 66

Slide 66 text

主な指標のANR発⽣詳細。折れ線グラフで確認可能。

Slide 67

Slide 67 text

ANR発⽣のAndroidVersion等

Slide 68

Slide 68 text

ANRの詳細。

Slide 69

Slide 69 text

バージョン等の情報も⾒られます

Slide 70

Slide 70 text

ANRのStackTraceも⾒られます

Slide 71

Slide 71 text

Android Vitalsは ● CrashlyticsのSDKでは取得できないイベ ントをキャプチャできる ○ SDK初期化よりも前に発⽣した起動時のCrash ○ Android12以前のANR Android Vitals vs Crashlytics

Slide 72

Slide 72 text

Android Vitalsは ● GooglePlayからInstallされたアプリ のみ ● Google認定デバイス上のもののみ Android Vitals vs Crashlytics

Slide 73

Slide 73 text

Android Vitalsは ● 使⽤状況および診断情報の共有をオプトインし たユーザーの情報のみ ● ユーザープライバシー保護のため、匿名化され たレポートの作成に⼗分なデータを収集できた 場合にのみ Android Vitals vs Crashlytics

Slide 74

Slide 74 text

Android VitalsとCrashlyticsで問題発⽣率の計算⽅法が異なる場 合がある ex)あるユーザーが1⽇3回アプリを利⽤し、1回クラッシュ ● Android Vitals 1⽇のアクティブユーザーごとなので100% ● Crashlyticsはセッションごとなので33% Android Vitals vs Crashlytics

Slide 75

Slide 75 text

Android Vitals ゲーム系だと、Android Performance Tunerという pluginを⼊れると、フレームレート、読込み時間、 設定等の詳細パフォーマンスの情報も取れるらしい (対象がNativeGame(CおよびC++)またはUnity で利⽤可能

Slide 76

Slide 76 text

Android Vitals まとめ ● GooglePlayStoreでリリースしたアプ リのCrash等の情報が取得可能 ● 数値が悪すぎるとPlayStoreでの扱い が悪くなるので注意

Slide 77

Slide 77 text

Firebase Performance Monitoring

Slide 78

Slide 78 text

Firebase Performance Monitoring ● Firebaseのサービスの⼀部。 ● SDKをいれると⾃動計測してくれる ○ HTTPネットワーク ○ アプリ起動 ○ Activity/Fragmentのフリーズ情報

Slide 79

Slide 79 text

実際の画⾯

Slide 80

Slide 80 text

カスタムで⾒たい指標の推移グラフが⾒える

Slide 81

Slide 81 text

ネットワークのResponseの時間

Slide 82

Slide 82 text

処理にどれだけの時間がかかったか

Slide 83

Slide 83 text

画⾯レンダリング情報

Slide 84

Slide 84 text

ネットワークとトレースは詳細も

Slide 85

Slide 85 text

さらに匿名化されたピックアップ情報も

Slide 86

Slide 86 text

下には処理の所要時間、ネットワーク時間も

Slide 87

Slide 87 text

● SDKを⼊れると⾃動で計測 ● ネットワークやメソッドの所要時間 がわかるほか、サンプル抽出された セッション詳細も⾒られる FirebasePerfomanceMoni toringまとめ

Slide 88

Slide 88 text

JankStats

Slide 89

Slide 89 text

https://developer.android.com/topic/per formance/jankstats?hl=ja androix library(※α版) フレーム統計情報に関するレポートを⽤意 JankStats

Slide 90

Slide 90 text

JankStats Windowオブジェクトを監視し、 Listenerに情報を送る Frameの更新ごとに情報が送られる

Slide 91

Slide 91 text

JankStatsの内容 ● フレームの開始時間 ● 持続時間 ● フレームをジャンクと⾒なすかどう か

Slide 92

Slide 92 text

ログ内容 FrameData( frameStartNanos=155698764771, frameDurationUiNanos=441821978, frameDurationCpuNanos=449129115, frameDurationTotalNanos=449769688, frameOverrunNanos=179341377, isJank=false, )

Slide 93

Slide 93 text

JankStats state 独⾃stateを追加可能。 if (listScrollState.isScrollInProgress){ performanceStateHolder.state?.putState(IS_SCROLLING, "true") } else { performanceStateHolder.state?.removeState(IS_SCROLLING) }

Slide 94

Slide 94 text

JankStats state stateは複数キー追加可能 同じキーだと上書きされる

Slide 95

Slide 95 text

JankStatsまとめ ● frameのレンダリング時間測定 ● stateを適宜追加しジャンクの起こっ ている状態を確認、ログ等を送るこ とが可能

Slide 96

Slide 96 text

Benchmarkの 継続的インテグレーション実⾏

Slide 97

Slide 97 text

Benchmarkのインテグレー ションテスト 先述のBenchmark TestをFirebase Test Lab等で継続的に実⾏  →時間測定値の差分を監視することで 悪化をキャッチする

Slide 98

Slide 98 text

Benchmarkのインテグレー ションテスト Firebase Test Lab x Github Actionsでの 実⾏は公式サンプルがある https://github.com/android/performa nce-samples/tree/main/Macrobench markSample/ftl

Slide 99

Slide 99 text

まとめ 04.

Slide 100

Slide 100 text

まとめ ● パフォーマンス改善は⼀箇所ずつ ● 本番に近いアプリで調査する ● 調査→修正を繰り返す ● モニタリングで悪化箇所をチェック