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