Измерьте время запуска приложения Android

Как наиболее точно измерить время запуска приложения для Android?

Под временем запуска я подразумеваю разницу между 2. и 3.:

  1. Процесс приложения не запущен
  2. Пользователь нажимает на значок приложения в панели запуска
  3. Основная деятельность полностью инициализирована

Поэтому мне нужно как-то получить время с момента запуска JVM и зарегистрировать его.

9 ответов

Решение

Я понимаю, что слишком поздно, чтобы ответить, тем не менее, это точно отвечает на вопрос.

Эта информация по умолчанию регистрируется в Logcat для API версии 19 или выше.

Начиная с Android 4.4 (уровень API 19), logcat включает строку вывода, содержащую значение с именем Displayed. Это значение представляет количество времени, прошедшее между запуском процесса и завершением рисования соответствующего действия на экране.

ActivityManager: отображается com.android.myexample/.StartupTiming: +3s534ms

Ключ ищет его в нужном месте -

Если вы отслеживаете вывод logcat из командной строки или из терминала, найти истекшее время просто. Чтобы найти истекшее время в Android Studio, необходимо отключить фильтры в представлении logcat. Отключение фильтров необходимо, потому что системный сервер, а не само приложение, обслуживает этот журнал.

Выдержки из документации.

Я собираюсь интерпретировать ваш вопрос как "Достаточно ли быстро запускается мое приложение? Как я могу проверить, что я сделал все, что мог?

Время запуска в значительной степени является ложной метрикой, поскольку оно будет варьироваться в зависимости от устройства и ПЗУ. Я думаю, что вас, скорее всего, заинтересует то, сколько кода занимает много времени для выполнения и что потенциально блокирует основной поток.

Я обнаружил, что наиболее эффективный способ сделать это - использовать 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();
}

После того, как трассировка будет собрана, вы сможете увидеть все, что существенно влияет на время запуска. В моем случае, как показано ниже, в потоке пользовательского интерфейса был большой разрыв, где он был заблокирован.

основной поток заблокирован

Выяснилось, что как Crashlytics, так и Coremetrics требуют вызова randomUUID() который затем синхронизировался между потоками и блокировал основной поток. Решением было просто ускорить новый поток для инициализации кода Coremetrics.

Это то, что я бы не понял, просто измерив время запуска, но на самом деле оно ускорило "время запуска" приложения на несколько сотен миллисекунд.

Вот еще один снимок после выделения отдельного потока для инициализации Coremetrics:

основной поток не заблокирован

Проверьте в оболочке adb ниже.

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"); чтобы получить время, необходимое для достижения этого шага.

Простой способ отобразить время запуска в Android.

Иногда Displayedстрока в выводе logcat содержит дополнительное поле для общего времени. Например:

      ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)

В этом случае первое измерение времени относится только к активности, которая была нарисована первой.

Источник: время до первоначального отображения

Я думаю, что это было встроено в Firebase Console, сейчас не работает

Можно реализовать отслеживание времени, используя следующий код:

Переопределить ваш Application:

public class CustomApplication extends Application {
    public final static long APP_START_TIME = System.currentTimeMillis();

    /**
     * Do all other application stuff
     */
}

И добавьте несколько строк в ваш основной 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>

Важное замечание: Перед запуском необходимо закрыть приложение, поскольку приложение хранит статическую переменную, которая отслеживает начальное время

Используйте SysTrace

Также класс Trace может быть использован для измерения сечений с помощью

Trace.beginSection("name");
Trace.endSection();

Это видео с YouTube также является кратким руководством.

Один из вариантов - сэкономить время в начале onCreate() метод и в конце onCreate() method а затем вычтите эти времена друг от друга, чтобы получить время, необходимое для инициализации приложения.

Другие вопросы по тегам