Измерьте время запуска приложения Android
Как наиболее точно измерить время запуска приложения для Android?
Под временем запуска я подразумеваю разницу между 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)
В этом случае первое измерение времени относится только к активности, которая была нарисована первой.
Источник: время до первоначального отображения
Можно реализовать отслеживание времени, используя следующий код:
Переопределить ваш 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
а затем вычтите эти времена друг от друга, чтобы получить время, необходимое для инициализации приложения.