Первый запуск Android-приложения очень медленный, а systrace показывает 30 секунд bindApplication
В настоящее время я разрабатываю приложение для Android и пытаюсь улучшить время запуска. Для этого я использую инструмент Systrace.
При первом запуске приложения (сразу после установки) его запуск занимает ~40 секунд, и я получаю следующую трассировку:
Как видите, на 30 секунд светло-фиолетовый тег с заголовком bindApplication
,
После этого я закрываю приложение (удалено из недавних действий) и снова открываю его. На этот раз bindApplication
тег длиной всего 4 секунды:
- Кто-нибудь знает, нормально ли, чтобы первый запуск длился так долго?
- Что я могу сделать, чтобы улучшить это?
Я предполагаю, что bindApplication
связано как-то с тяжелой работой в onCreate
Метод приложения, но я не понимаю, как это могло произойти. На всякий случай это помогает: по моему onCreate
Я инициализирую следующие библиотеки: Parse, Crashlytics, Timber, ParseFacebookUtils и Google Analytics.
РЕДАКТИРОВАТЬ:
Вот код подкласса приложения:
public class MyApp extends Application {
private Tracker tracker;
@Override public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
Trace.beginSection("MyApp");
}
Fabric.with(this, new Crashlytics());
// Parse setup
Parse.enableLocalDatastore(this);
ParseObject.registerSubclass( ... );
Parse.Configuration.Builder parseConfigBuilder = new Parse.Configuration.Builder(this).applicationId(
getString(R.string.parse_application_id))
.server(getString(R.string.parse_server_url));
if (BuildConfig.DEBUG) {
// add logs
Timber.plant(new DebugTree());
Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);
parseConfigBuilder.addNetworkInterceptor(new ParseLogInterceptor());
}
Parse.initialize(parseConfigBuilder.build());
ParseFacebookUtils.initialize(this);
ParseInstallation.getCurrentInstallation().saveInBackground();
AnalyticsManager.getInstance().init(this);
AnalyticsManager.getInstance().debugMode(BuildConfig.DEBUG);
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().
detectAll()
.penaltyLog()
.build());
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
Trace.endSection();
}
}
/**
* Gets the default {@link Tracker} for this {@link Application}.
* @return tracker
*/
synchronized public Tracker getDefaultTracker() {
if (tracker == null) {
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
// To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
tracker = analytics.newTracker(R.xml.global_tracker);
}
return tracker;
}
}
1 ответ
Это проблема мгновенного бега. у меня когда-то была такая проблема, и я решаю, если отключить мгновенный запуск. вот тот же вопрос, и вы можете найти свой ответ в комментарии вопроса.
Первый запуск занимает много времени (ClassLoader ссылается на неизвестный путь)