Измерение времени запуска приложения Android - программирование
Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Я нашел наиболее эффективный способ сделать это, чтобы использовать 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:

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

Ответ 3

Проверьте оболочку 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.

Ответ 4

Оберните весь метод onCreate() в TimingLogger. Просто поставьте это в начале:

TimingLogger timings = new TimingLogger(TAG, "methodA");

и это в конце:

timings.dumpToLog();

Если вы хотите отбросить время на каком-то промежуточном шаге, вы можете сделать timings.addSplit("name");, чтобы получить время, необходимое для перехода на этот шаг.

Ответ 5

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

Ответ 6

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

Переопределите 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>

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

Ответ 7

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

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

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

Этот видео YouTube является быстрым праймером.