はじめに
Google I/Oの What's new in app performanceの要点をまとめます。
Androidフレームワークの改善のパートは割愛しておりますのでご了承ください。
01 ツール
Android Studio Profiler / Perfetto
- Android StduioのProfilerでトレースできる
- それを保存しチームに共有することもできる
- またPerfettoを使用することで、Android Studioがなくても詳細に分析できる。
- 相互運用可能。Profilerでトレースした内容は、Perfettoでも開ける
Android Vitals
- Google PlayConsoleの一部
- 実際にデバイスを使用してくれている人のさまざまなパフォーマンスを情報を確認できるのがメリット
02 アプリの起動
アプリの起動時間はユーザに良い影響を与える反面、悪い影響も与える。
そもそも起動時間を短縮するのにメリットはあるのか?
アプリの起動速度を改善すると、ビジネス指標にめっちゃいい影響でる。
Google Mapsが30%起動速度を上げたら、2.4%検索が増えた。
zomatoはアプリの30%起動速度を上げたら、600K注文が増えた。
まずパフォーマンスを計測してみる
「自分のアプリがどれだけのパフォーマンスか?」を計測できるものがある。
それが「Macrobenchmarkライブラリ」。
アプリの起動速度、フレームのタイミングなどに関するデータを取得できる。
Githubにサンプルあります。
https://github.com/android/performance-samples
03 Baseline profiles
アプリのパフォーマンスを高速化できる、非常に信頼性が高く、実装が迅速な方法。
Baseline Profilesとは?
APK に含まれるクラスとメソッドのリスト。ベースライン プロファイルは APK に含まれるクラスとメソッドのリストです。Android ランタイム(ART)がインストール時に、マシンコードへのクリティカル パスを事前コンパイルするために使用します。
引用: https://developer.android.com/studio/profile/baselineprofiles
要は、起動時に必要な処理を事前に示しておけば、アプリの起動速度が上がりますよ的な話
開発者ブログにも詳しく書かれてます。
https://android-developers.googleblog.com/2022/01/improving-app-performance-with-baseline.html
Baseline Profilesの導入方法
下記の2ステップ。
- 専用のmacrobenchmarkを記述し、プロファイルを作成する
- アプリinstall中に使用できるようにする
「App starup」ライブラリも使える
アプリのスタートアップ中のリソースの競合を回避するのに役立つ。
起動中にContentsProviderを使用する必要がなくなり、パフォーマンスとコンポーネントの初期化が高速化する。
04 Jankの監視
- フレームを落としたり(カクカクする)などの、ジャンクを発生させないことも重要
- だいたいメインスレッドでたくさん処理をすると発生する
- ANRにもつながる。
この改善をするとどういう美味しいことがあるの?
45% フレーム落ちを少なくしたら、10%のエンゲージメントがあがった
ANRを減らしたら、20%良いレビューが増えたぜ。アンインストールも5%減ったぜ。
OK CreditもANRを減らしたら、トランザクション増えた。
検出方法
Profilerでジャンクの検出もできる。
1クリックで問題の詳細がわかる。
ジャンクの再現が難しい場合もある
ただ、ジャンクを再現するのが難しい場合がある。
たとえば、実際はジャンクが発生しているのに、トレースしたときたまたま、フレーム落ちがなくて問題なく見えてしまうなど、タイミング的な要素が絡んでくる。
MicroBenchmarkを使えば、統計的に有意な結果が得られるまでコードをテストしてくれる
これを使えば、VitalsやProfilerで見たジャンク的なものが、単なるまぐれなのかどうかまで、示してくれる。
スペックが低いデバイスのパフォーマンス計測はどうするか?
ただ、スペック的にうんこなAndroid端末を使用してパフォーマンスを計測できるとはかぎらん。
そこで 「Jank Stats」(alpha)
ユーザのデバイスで発生したジャンクをログに記録して追跡することができる。
感想
- PerfettoはAndroid Profilerにとって変わられたものだと思ってたけど、立ち位置としては、Android Studioでのトレースをより詳しく確認したり、Android Studioなしで結果を見たりみたいな用途っぽい
- BaseLineProfilesのファイル作成しておけば、起動速度速くなる魔法感がすごい
- Jank Statsは、アプリに入れとけば、ジャンクが発生してたらレポートしてくれるみたいな便利ものなのか?ちなレポートはどこに保存されるんだ?
- 計測の方法はいろいろあるけど、CIとかに組み込んで、定期的にパフォーマンスのチェックをしたいな