モチベーション
デバッグではランダムに時間が増えてしまうので、基本的にデバッグが有効の場合でプロファイルしても実際にかかっている時間は取れないです。ですが、これまではデバッグでしかプロファイルが取れなかったので、正確なものを見るにはOSごと書き換えたりとかしかなかったです。
ランダムに時間が増える図
それがAPI level 30で、Android Studio Bumblebee (2021.1.1) からProfileable apkが利用できるようになりました。
Using the profileable flag instead of the debuggable flag has the key advantage of lower overhead for performance measurement; however, certain profiling features are not available for Profileable builds, such as the Event timeline, API initiated CPU profiling, heap dumps, or live location recordings.
どうやってやるか
基本的には以下の通りなんです。
ただこれは、すでにプロセスが起動している場合の手順なので起動時のパフォーマンス計測には使えません。Android StudioのEdit configuration -> Profileを使った方法も動かなかったです。 (Android Studio Bumblebee | 2021.1.1 Patch 2で確認)
そこでググってみると、以下のようなドキュメントが見つかります。
アプリ側の設定
この節のコードを入れてリリースしないようにしてください
デバッグと同じキーストアを使って
create("release") {
storeFile = rootProject.file("keystore/debug.keystore")
storePassword = "aaaa"
keyAlias = "...."
keyPassword = "aaaa"
お好みで、難読化だけ外します。
postprocessing {
isRemoveUnusedCode = true
isRemoveUnusedResources = true
isOptimizeCode = true
// for profile
isObfuscate = false
proguardFile("proguard-rules.pro")
}
以下をAndroidManifest.xmlのapplicationタグの下にいれます。
<profileable android:shell="true"/>
あとはリリースビルドをしてapkを端末にインストールしておきます。
実際のとり方
ここのtgzからtgzファイルをダウンロードして解凍します。
以下のコマンドを打ち込むとアプリが起動するので、起動が終わったらCommand + Cで終了します。起動時のパフォーマンスのファイル perf.data
を作ることができます。
./app_profiler.py -p パッケージ名 -a Activity名
これを表示するには基本的には./report.pyなどを動かすだけです。
M1 Macで動かない?
このperf.data
はAndroid Studioで使うことができません。変換する必要があります。
この変換は./report.pyなどで行われているのですが、M1 Macだと動かないバイナリがあり、現状動かないようです。以下のようにしてAndroid側で変換しちゃうことができます。
// Androidに送る
adb push perf.data /sdcard/Download/perf.data
// Android上で変換
adb shell /data/local/tmp/simpleperf report-sample --protobuf --show-callchain -i /sdcard/Download/perf.data -o /sdcard/Download/perf.trace
// 端末からpullする
adb pull /sdcard/Download/perf.trace
Android Studioで読み込む
あとはAndroid StudioのProfilerからプラスボタンを押して、Load from fileでpullしたperf.traceを読めばプロファイルを見ていくことができます。これで具体的にこのメソッドが遅い!と特定していくことができます。
まとめ
起動時のプロファイルを見ていくことができました。
もっとこうしたほうがいいよという方法がある方はぜひお教えください。