3
Help us understand the problem. What are the problem?

posted at

updated at

Organization

Profileable apkを使ってリリースapkで起動時に実際に何が時間がかかっているのかを確認する

モチベーション

デバッグではランダムに時間が増えてしまうので、基本的にデバッグが有効の場合でプロファイルしても実際にかかっている時間は取れないです。ですが、これまではデバッグでしかプロファイルが取れなかったので、正確なものを見るには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ファイルをダウンロードして解凍します。

image.png

以下のコマンドを打ち込むとアプリが起動するので、起動が終わったら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を読めばプロファイルを見ていくことができます。これで具体的にこのメソッドが遅い!と特定していくことができます。

まとめ

起動時のプロファイルを見ていくことができました。
もっとこうしたほうがいいよという方法がある方はぜひお教えください。 :pray:

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
3
Help us understand the problem. What are the problem?