Медленный запуск приложения xamarin

Мы разрабатываем кроссплатформенное приложение на PCL, но в настоящее время мы используем только устройства Android для тестирования.
Нас беспокоит то, что его запуск занимает от 6 до 8 секунд (в зависимости от того, какое устройство мы тестируем). приложение, которое работает очень медленно.
После установки нескольких точек останова мы увидели, что время расходуется довольно равномерно.
Мы заметили, что эта конкретная часть заняла больше времени:

  • 1 с до достижения onCreate() в MainActivity (есть заставка, перед которой есть только одно изображение и цвет фона)
  • 1s on base.OnCreate(bundle);
  • 1s on global::Xamarin.Forms.Forms.Init(this, bundle);
  • 1,5 с на Page mainPage = new LogScreen(); (создание главной страницы, чтобы затем установить ее в качестве основной страницы навигации).

person n.lell    schedule 11.09.2017    source источник


Ответы (4)


Первое, что я бы порекомендовал, это не тестировать отладочную сборку вашего приложения, пути кода среды выполнения Mono и Jit-кода не совпадают с сборкой выпуска, использованием общих сред выполнения, размеров сборки и т. д. и т. д. и т. д. будут влиять на время запуска и выполнения.

Вот примеры времени запуска «очень большого» агрессивно настроенного приложения на основе Android Forms на устройствах высокого и низкого уровня с использованием собственного эталонного теста (условно скомпилированного, а не внедренного и с использованием системных часов ОС).

Обзор приложения:

  • Xamarin.Forms v2.4.0.269-pre2
  • Сочетание закодированных и основанных на XAML страниц, элементов управления и т. д.
  • Компилятор XAML включен
  • "Splash screen" disabled
    • A Theme-based splash on MainActivity will add:
      • 200+ milliseconds to startup times on a fast device,
      • 1-2 секунды на устройстве с медленным доступом к флэш-памяти
    • Только не используйте заставку на основе Activity ;-)
  • Мультидекс
  • Proguard'd (агрессивно уменьшенные банки с помощью тестирования пользовательского интерфейса с циклом автоматической обратной связи)
  • Linker (связать все, агрессивно уменьшенные размеры сборки с пользовательским файлом описания ссылки, созданным с помощью тестирования пользовательского интерфейса с автоматической обратной связью)
  • На 100 % построено из исходного кода, что позволяет сворачивать пространства имен и сокращать количество сборок.
  • Архитектура Viper без сторонних DI/IoC
  • Дизайн с ленивой загрузкой с использованием данных, очередей приоритетов сети ресурсов и объявлений
  • Живые объекты Realm и запросы, используемые для всех данных (минимальный размер БД: 250 МБ, максимальный размер 1,2 ГБ)

Время генерируется с помощью сценария оболочки, который перезагружает устройства, отслеживает запуск, ожидая, пока система установится, запускает ряд приложений (GApps, Facebook, Instagram, Twitter и т. д.), ожидает, пока система не установится, а затем запускает приложение Forms через:

export deviceTime=$(echo "$(adb -s $deviceID shell cat /proc/uptime | awk '{print $1}') * 1000" | bc -l)
adb -s $deviceID shell am start -n com.sushihangover.GeneticCancerDNAMapper/com.sushihangover.GeneticCancerDNAMapper.DevOpsDashboard --el startTime ${deviceTime%.*}

Устройство Google Pixel (на базе Oreo) (приложение можно использовать примерно через 430 мс):

I GeneticCancerDNAMapper: 0.162 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate
I GeneticCancerDNAMapper: 0.164 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.SetTheme
I GeneticCancerDNAMapper: 0.201 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.OnCreate
I GeneticCancerDNAMapper: 0.244 : Xamarin.Forms.Forms.Init
I GeneticCancerDNAMapper: 0.266 : Realms.Realm.GetInstanceAsync ~Get Instance & Data~
I GeneticCancerDNAMapper: 0.324 : Realms.Realm.GetInstanceAsync ~Obtained Instance & Data~
I GeneticCancerDNAMapper: 0.324 : Xamarin.Forms.Application Content
I GeneticCancerDNAMapper: 0.349 : Xamarin.Forms.Application Content ~Creation Completed~
I GeneticCancerDNAMapper: 0.353 : Xamarin.Forms.Application.MainPage ~Displayed~
I GeneticCancerDNAMapper: 0.43 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication

Бюджетное устройство «Android One» 512 МБ с очень медленной флэш-памятью (приложение можно использовать примерно через 4,5 с):

Re: https://en.wikipedia.org/wiki/Android_One

I/GeneticCancerDNAMapper(10904): 2.453 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate
I/GeneticCancerDNAMapper(10904): 2.467 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.SetTheme
I/GeneticCancerDNAMapper(10904): 2.731 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.OnCreate
I/GeneticCancerDNAMapper(10904): 3.016 : Xamarin.Forms.Forms.Init
I/GeneticCancerDNAMapper(10904): 3.166 : Realms.Realm.GetInstanceAsync ~Get Instance & Data~
I/GeneticCancerDNAMapper(10904): 3.571 : Realms.Realm.GetInstanceAsync ~Obtained Instance & Data~
I/GeneticCancerDNAMapper(10904): 3.571 : Xamarin.Forms.Application Content
I/GeneticCancerDNAMapper(10904): 3.772 : Xamarin.Forms.Application Content ~Creation Completed~
I/GeneticCancerDNAMapper(10904): 3.799 : Xamarin.Forms.Application.MainPage ~Displayed~
I/GeneticCancerDNAMapper(10904): 4.457 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication
person SushiHangover    schedule 12.09.2017

Это распространенная проблема при использовании Xamarin.Forms, есть много потоков, связанных с этим, особенно этот:

https://forums.xamarin.com/discussion/93178/lets-talk-performance/p6

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

Вот несколько советов, которые вы можете сделать, чтобы улучшить его:

https://blog.xamarin.com/5-ways-boost-xamarin-forms-app-startup-time/

person Mario Galván    schedule 11.09.2017
comment
Хороший Марио +1 ;) - person Claudio Redi; 12.09.2017

Я соберу все решения, которые мы нашли для этого, так что все в одном месте.

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

Кроме этого, мы также сделали следующие вещи:

  • Установите флажок "оптимизировать код" в разделе "Свойства" во всех проектах. Не уверен, что это конкретно улучшает время запуска, но, похоже, немного помогает в общей производительности.
  • Добавьте AOT и LLVM. Мы нашли способ сделать это, несмотря на то, что эта опция недоступна в нашей среде IDE. Это значительно увеличивает время сборки, поэтому, если вы хотите это сделать, я бы рекомендовал делать это только для выпускных сборок.
  • Включите быструю отрисовку Xamarin. Это экспериментальная вещь, поэтому вы должны прочитать некоторую документацию об этом, но это делается путем добавления этой строки global::Xamarin.Forms.Forms.SetFlags("FastRenderers_Experimental"); в метод MainActivity.OnCreate() перед global::Xamarin.Forms.Forms.Init(this, bundle);
  • Обновите нашу версию Xamarin.Forms Nuget. Это должна быть одна и та же версия для всех проектов вашего решения, у нас были некоторые проблемы с жестами касания, которые также улучшились благодаря этому.
  • Связать сборки SDK. В разделе «Свойства» > «Параметры Android» в разделе «Связывание» вы можете установить ссылку «Только сборки SDK». Вы также можете установить все сборки, но это не рекомендуется, если вы используете пользовательские сборки.
  • Экраны предварительной загрузки. Это значительно улучшило производительность самого приложения. Мы загружали на каждом экране, в фоновом режиме, представления и модели представлений, которые были необходимы дальше, поэтому при добавлении их в стек навигации они уже были загружены. Это значительно сократило время перехода между страницами.
person n.lell    schedule 03.07.2018

Я нашел решение для этого. Например, у нас есть 5 вкладок. И у нас есть 5 viewmodel или 5 codebehind. Для каждой вкладки в конструкторе модели представления мы определили метод запуска таймера. И конструктор первой вкладки инициализируется через 700 мс после запуска таймера. И вторая вкладка начинается через 1 секунду после. Давайте код для этого:

Первая вкладка «Главная» и «домашний вид» — это HomeViewModel.

public void HomeTimer()
{
    timer.Interval = 700;

    timer.Elapsed += (sender, e) => OnTimedEvent(sender, e);

    timer.AutoReset = false;

    timer.Enabled = true;
}

private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
    timer.Enabled = false;

    Yap(); // yap command all the page listview and get api.
}
System.Timers.Timer timer = new System.Timers.Timer();

public HomeViewModel()
{
    HomeTimer(); // hometimer starting
}

И вторая вкладка - MyPage, а модель представления - MyPageViewModel, а конструктор такой же:

public void MyPageTimer()
{
    timer.Interval = 1000; //look. home page starting 0.7 seconds after and mypage starting 1 seconds after.

    timer.Elapsed += (sender, e) => OnTimedEvent(sender, e);

    timer.AutoReset = false;

    timer.Enabled = true;
}

private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
    timer.Enabled = false;

    GetMypage(); // and getmypage method all the initialize the page and listview and webapi works.
}
System.Timers.Timer timer = new System.Timers.Timer();

public MyPageViewModel()
{
    MyPageTimer();
}

И этой операцией я удаляю 1 секунду из автозагрузки. До этой операции мое приложение запускалось с 3,2 секунды, а теперь с 2,2 секунды.

person Hasan Tuna Oruç    schedule 15.06.2019