Android アプリの起動時間を測定する最も正確な方法は何ですか?
起動時間とは、2. と 3. の違いを意味します。
- アプリ プロセスが実行されていません
- ユーザーがランチャーのアプリ アイコンをクリックする
- メイン アクティビティは完全に初期化されています
したがって、基本的には、JVM が開始してからの経過時間を取得してログに記録する必要があります。
Android アプリの起動時間を測定する最も正確な方法は何ですか?
起動時間とは、2. と 3. の違いを意味します。
したがって、基本的には、JVM が開始してからの経過時間を取得してログに記録する必要があります。
答えるには遅すぎることは承知していますが、これは質問に正確に答えています。
この情報は、API バージョン 19 以降のデフォルトで Logcat に記録されます。
Android 4.4 (API レベル 19) から、logcat には Displayed という値を含む出力行が含まれます。この値は、プロセスの起動から対応するアクティビティの画面への描画が完了するまでの経過時間を表します。
ActivityManager: 表示された com.android.myexample/.StartupTiming: +3s534ms
重要なのは、適切な場所でそれを探すことです-
コマンド ラインまたはターミナルで logcat の出力を追跡している場合、経過時間は簡単にわかります。Android Studio で経過時間を確認するには、logcat ビューでフィルターを無効にする必要があります。アプリ自体ではなく、システム サーバーがこのログを提供するため、フィルターを無効にする必要があります。
抜粋はドキュメンテーションからのものです。
あなたの質問を「私のアプリの起動時間は十分速いですか?」と解釈します。できることをすべてやったかどうかを確認するにはどうすればよいですか?」
起動時間は、デバイスや ROM によって異なるため、多くの場合誤った指標です。あなたが最も関心を持っているのは、実行に時間がかかっているコードの量と、メイン スレッドをブロックしている可能性のあるものだと思います。
これを行う最も効果的な方法は、アプリの開始時にTraceviewを使用し、メソッドの実行にかかる時間と、メイン スレッドにギャップがあるかどうかを確認することです。
トレースを開始します。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Debug.startMethodTracing("startup");
}
}
トレースを停止します。
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Debug.stopMethodTracing();
}
トレースが収集されると、起動時間に大きな影響を与えているものをすべて確認できるはずです。私の場合、以下に示すように、ブロックされている UI スレッドに大きなギャップがありました。
Crashlytics と Coremetrics の両方が呼び出しを必要としており、その呼び出しがrandomUUID()
スレッド間で同期され、メイン スレッドをブロックしていることが判明しました。解決策は、Coremetrics コードを初期化するために新しいスレッドを起動することだけでした。
これは、起動時間を測定するだけではわかりませんでしたが、実際にはアプリの「起動時間」が数百ミリ秒短縮されました。
Coremetrics の初期化のために別のスレッドをスピンオフした後の別のスナップショットを次に示します。
以下の方法で adb shell にチェックインします。
adb shell
adb logcat -b events | grep am_activity_launch_time
[Output]
01-01 12:32:53.469 1236 1262 I am_activity_launch_time:
[0,205360373,com.sec.android.app.clockpackage/.ClockPackage,378,**378**,0]
Remarks:
Launch time for Clock is 378ms.
onCreate()
メソッド全体をTimingLogger
. これを最初に置くだけです:
TimingLogger timings = new TimingLogger(TAG, "methodA");
そして最後にこれ:
timings.dumpToLog();
途中のステップで時間を落としたい場合はtimings.addSplit("name");
、そのステップに到達するのにかかった時間を取得することができます。
次のコードを使用してタイム トラッキングを実装することができます。
あなたのをオーバーライドしますApplication
:
public class CustomApplication extends Application {
public final static long APP_START_TIME = System.currentTimeMillis();
/**
* Do all other application stuff
*/
}
そして、 main にいくつかの行を追加しますActivity
:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View contentView = findViewById(android.R.id.content);
contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= 16) {
contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
contentView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME;
Log.e("TEST", "App launch time = " + launchTime);
}
});
}
}
でカスタム アプリケーションを定義することを忘れないでくださいManifest
。
<application
android:label="@string/app_name"
android:name=".CustomApplication" >
</application>
重要: アプリケーションは初期時間を追跡する静的変数を格納するため、起動前にアプリケーションを強制終了する必要があります。
Androidで起動時間を表示する簡単な方法。
Displayed
logcat 出力の行に、合計時間の追加フィールドが含まれている場合があります。例えば:
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)
この場合、最初の測定は、最初に描画されたアクティビティのみです。
出典:初回表示までの時間
1 つの可能性として、onCreate()
メソッドの開始時と終了時の時間を保存し、onCreate() method
これらの時間を互いに減算して、アプリの初期化にかかった時間を取得することができます。