Udostępnij za pośrednictwem


Mechanika kompilacji systemu iOS

W tym przewodniku opisano, jak korzystać z aplikacji i jak używać metod, które można stosować do szybszych kompilacji dla wszystkich konfiguracji kompilacji.

Tworzenie wspaniałych aplikacji to nie tylko pisanie kodu, który działa. Dobrze napisana aplikacja powinna zawierać optymalizacje, które zapewniają szybsze kompilacje z aplikacjami, które są mniejsze i szybsze. Te optymalizacje nie tylko spowodują lepsze środowisko dla użytkownika, ale także dla Ciebie lub dowolnego dewelopera pracującego nad projektem. Ważne jest, aby upewnić się, że w przypadku pracy z aplikacją wszystko jest często wykonywane.

Pamiętaj, że opcje domyślne są bezpieczne i szybkie, ale nie są optymalne dla każdej sytuacji. Ponadto wiele opcji może spowolnić lub przyspieszyć cykl projektowania w zależności od poszczególnych projektów. Na przykład natywne usuwanie zajmuje dużo czasu, ale jeśli bardzo mały rozmiar zostanie uzyskany, czas spędzony na usunięciu nie zostanie odzyskany przez szybsze wdrożenie. Z drugiej strony natywne usuwanie może znacznie zmniejszyć aplikację, w tym przypadku będzie szybsze wdrażanie. Różni się to między projektami, a jedynym sposobem, aby wiedzieć, jest przetestowanie.

Szybkość kompilacji platformy Xamarin może również mieć wpływ na różne pojemności i możliwości komputera, niż może mieć wpływ na wydajność: możliwości procesora, szybkość magistrali, ilość pamięci fizycznej, szybkość dysku, szybkość sieci. Te ograniczenia wydajności wykraczają poza zakres tego dokumentu i są odpowiedzialne za dewelopera.

Aplikacje chronometrażu

Aby włączyć diagnostyczne dane wyjściowe programu MSBuild w Visual Studio dla komputerów Mac:

  1. Kliknij pozycję Visual Studio dla komputerów Mac > Preferencje...
  2. W widoku drzewa po lewej stronie wybierz pozycję Projekty kompilacji >
  3. W panelu po prawej stronie ustaw listę rozwijaną Czas szczegółowości dziennika na Diagnostyka: Setting the Log verbosity
  4. Kliknij przycisk OK.
  5. Ponowne uruchamianie Visual Studio dla komputerów Mac
  6. Czyszczenie i ponowne kompilowanie pakietu
  7. Wyświetlanie danych wyjściowych diagnostycznych w okienku błędów ( Wyświetl > błędy padów > ) przez kliknięcie przycisku Build Output (Dane wyjściowe kompilacji)

Mtouch chronometrażu

Aby wyświetlić informacje specyficzne dla procesu kompilacji mtouch, przekaż --time --time do argumentów mtouch w obszarze Opcje projektu. Wyniki znajdują się w danych wyjściowych kompilacji, wyszukując MTouch zadanie:

Setup: 36 ms
Resolve References: 982 ms
Extracted native link info: 987 ms
...
Total time: 1554 ms

Połączenie z programu Visual Studio z hostem kompilacji

Narzędzia Xamarin działają technicznie na dowolnym komputerze Mac, który może uruchamiać system OS X 10.10 Yosemite lub nowszy. Jednak środowiska deweloperskie i czasy kompilacji mogą być utrudnione przez wydajność komputera Mac.

W stanie rozłączenia program Visual Studio w systemie Windows wykonuje tylko fazę kompilacji języka C# i nie próbuje wykonać łączenia lub kompilacji AOT, spakować aplikację do pakietu .app lub podpisać pakiet aplikacji. (Faza kompilacji języka C# jest rzadko wąskim gardłem wydajności). Spróbuj wskazać, gdzie w potoku kompilacja spowalnia, kompilując bezpośrednio na hoście kompilacji na komputerze Mac w Visual Studio dla komputerów Mac.

Ponadto jednym z bardziej typowych miejsc do spowolnienia jest połączenie sieciowe między maszyną z systemem Windows i hostem kompilacji komputera Mac. Może to być spowodowane fizycznymi przeszkodami w sieci, użyciem połączenia bezprzewodowego lub koniecznością podróży przez maszynę nasyconą (taką jak usługa Mac-in-the-cloud).

Sztuczki symulatora

Podczas tworzenia aplikacji mobilnych niezbędne jest szybkie wdrażanie kodu. Z różnych powodów, takich jak szybkość i brak wymagań dotyczących aprowizacji urządzeń, deweloperzy często decydują się wdrożyć w wstępnie zainstalowanym symulatorze lub emulatorze. W przypadku producentów narzędzi deweloperskich decyzja o udostępnieniu symulatora lub emulatora sprowadza się do kompromisu między szybkością a zgodnością.

Firma Apple udostępnia symulator programowania dla systemu iOS, co przyspiesza zgodność, tworząc mniej restrykcyjne środowisko do uruchamiania kodu. To mniej restrykcyjne środowisko umożliwia środowisku Xamarin używanie kompilatora Just In Time (JIT) dla symulatora (w przeciwieństwie do AOT na urządzeniu), co oznacza, że kompilacja jest kompilowana do kodu natywnego w czasie wykonywania. Ponieważ komputer Mac jest znacznie szybszy niż urządzenie, pozwala to na lepszą wydajność.

Symulator używa udostępnionego modułu uruchamiania aplikacji, co umożliwia ponowne użycie modułu uruchamiania, w przeciwieństwie do kompilowania za każdym razem, co jest wymagane na urządzeniu.

Biorąc pod uwagę powyższe informacje, poniższa lista zawiera kilka informacji na temat kroków, które należy wykonać podczas kompilowania i wdrażania aplikacji w symulatorze, aby zapewnić najlepszą wydajność.

Wskazówki

  • W przypadku kompilacji:
    • Wybierz opcję Optimize PNG images (Optymalizuj obrazy PNG) w obszarze Project Options (Opcje projektu). Ta optymalizacja nie jest konieczna w przypadku kompilacji w symulatorze.
    • Ustaw konsolidator na Nie łącz. Wyłączenie konsolidatora jest szybsze, ponieważ wykonywanie go zajmuje dużo czasu.
    • Wyłączenie udostępnionego modułu uruchamiania aplikacji przy użyciu flagi --nofastsim powoduje, że kompilacje symulatora będą znacznie wolniejsze. Usuń tę flagę, gdy nie jest już wymagana.
    • Używanie bibliotek natywnych jest wolniejsze, ponieważ główny plik wykonywalny simlauncher nie może być ponownie używany w takich przypadkach, a plik wykonywalny specyficzny dla aplikacji musi być skompilowany dla każdej kompilacji.
  • W przypadku wdrożenia
    • Zawsze należy zachować uruchamianie symulatora, gdy jest to możliwe. Uruchomienie symulatora może potrwać do 12 sekund.
  • Dodatkowe Wskazówki
    • Preferuj kompilowanie nad kompilowaniem, ponieważ kompilowanie jest czyszczone przed budynkiem. Czyszczenie może zająć dużo czasu, ponieważ usuwa odwołania, które mogą być używane.
    • Korzystaj z faktu, że symulator nie wymusza piaskownicy. Posiadanie dużych zasobów, takich jak filmy wideo lub inne zasoby uwzględnione w projekcie, może tworzyć kosztowne operacje kopiowania plików za każdym razem, gdy aplikacja zostanie uruchomiona w symulatorze. Unikaj tych kosztowych operacji, umieszczając te pliki w katalogu głównym i odwołując się do nich w aplikacji przez pełną ścieżkę pliku.
    • W razie wątpliwości użyj flagi --time --time , aby zmierzyć zmianę

Poniższy zrzut ekranu przedstawia sposób ustawiania tych opcji dla symulatora w opcjach systemu iOS:

Screenshot shows Project Options, including Linker behavior, Additional mtouch arguments, and Optimize P N G images.

Sztuczki dotyczące urządzeń

Wdrażanie na urządzeniu jest podobne do wdrażania w symulatorze, ponieważ symulator jest małym podzbiorem kompilacji używanej dla urządzenia z systemem iOS. Kompilowanie dla urządzenia wymaga o wiele więcej kroków, ale ma zaletę zapewniania dodatkowych możliwości optymalizacji aplikacji.

Konfiguracje kompilacji

Podczas wdrażania aplikacji systemu iOS dostępnych jest wiele konfiguracji kompilacji. Ważne jest, aby dobrze zrozumieć każdą konfigurację, wiedzieć, kiedy i dlaczego należy zoptymalizować.

  • Debugowania
    • Jest to główna konfiguracja, która powinna być używana, gdy aplikacja jest opracowywana i dlatego powinna być możliwie najszybsza.
  • Wydania
    • Kompilacje wersji to te, które są dostarczane do użytkowników, a skupienie się na wydajności jest najważniejsze. W przypadku korzystania z konfiguracji wydania możesz użyć maszyny wirtualnej LLVM do optymalizacji kompilatora i optymalizacji plików PNG.

Ważne jest również, aby zrozumieć relację między tworzeniem i wdrażaniem. Czas wdrożenia jest funkcją rozmiaru aplikacji. Wdrożenie większej aplikacji trwa dłużej. Minimalizując rozmiar aplikacji, można skrócić czas wdrażania.

Minimalizacja rozmiaru aplikacji może również skrócić czas kompilacji. Dzieje się tak, ponieważ usuwanie kodu z aplikacji zajmuje mniej czasu niż natywnie kompilowanie kodu, który nie będzie używany. Mniejsze pliki obiektów oznaczają szybsze łączenie, co powoduje utworzenie mniejszego pliku wykonywalnego z mniejszą liczbą symboli do wygenerowania. W związku z tym oszczędność miejsca ma podwójną wypłatę, dlatego zestaw SDK linków jest domyślnym ustawieniem dla wszystkich kompilacji urządzeń.

Uwaga

Opcja Zestaw SDK linków może być wyświetlana tylko jako zestawy SDK platformy linków lub Zestawy SDK linków tylko w zależności od używanego środowiska IDE.

Wskazówki

  • Budować:
    • Tworzenie pojedynczej architektury (np. ARM64) jest szybsze niż plik binarny FAT (np. ARMv7 + ARM64)
    • Unikaj optymalizowania plików PNG podczas debugowania
    • Rozważ łączenie wszystkich zestawów. Optymalizowanie każdego zestawu
    • Wyłączenie tworzenia symboli debugowania przy użyciu polecenia --dsym=false. Należy jednak pamiętać, że wyłączenie tego ustawienia oznacza, że raporty o awarii mogą być symboliczne tylko na tej maszynie, która skompilowała aplikację, i tylko wtedy, gdy aplikacja nie została pozbawiona.

Niektóre rzeczy, których należy unikać, to:

  • Pliki binarne tłuszczu (debugowanie)
  • Wyłączanie konsolidatora --nolink
  • Wyłączanie usuwania
    • Symbole --nosymbolstrip
    • IL (wydanie) --nostrip.

Dodatkowe porady

  • Podobnie jak w przypadku symulatora, preferuj kompilowanie nad kompilacją
    • Zestawy AOT (pliki obiektów) są buforowane
  • Kompilacje debugowania trwa dłużej ze względu na symbole, uruchomione narzędzie dsymutil i ponieważ kończy się na większym, dodatkowym czasie przekazywania do urządzeń.
  • Kompilacje wydania domyślnie wykonują pasek IL zestawów. To zajmuje tylko trochę czasu i prawdopodobnie zostanie przywrócone podczas wdrażania mniejszej .app na urządzeniu.
  • Unikaj wdrażania dużych plików statycznych na każdej kompilacji (debugowanie)
    • Korzystanie z UIFileSharingEnabled (info.plist)
      • Zasoby można przekazywać raz
  • W razie wątpliwości użyj flagi --time --time , aby zmierzyć zmianę

Poniższy zrzut ekranu przedstawia sposób ustawiania tych opcji dla symulatora w opcjach systemu iOS:

Screenshot shows Project Options, including Linker behavior, Supported architectures, and other settings.

Korzystanie z konsolidatora

Podczas kompilowania aplikacji aplikacja mtouch używa konsolidatora do kodu zarządzanego, który usuwa kod, którego aplikacja nie używa. Teoretycznie zapewnia to mniejsze i dlatego szybsze kompilacje. Aby uzyskać więcej informacji na temat konsolidatora, zapoznaj się z przewodnikiem Łączenie w systemie iOS .

Podczas korzystania z konsolidatora należy wziąć pod uwagę następujące opcje:

  • Wybranie opcji Nie łącz dla kompilacji urządzenia zajmuje więcej czasu, a także generuje większą aplikację.
    • Firma Apple odrzuci aplikacje, jeśli są one większe niż limit rozmiaru. Zależnie od parametru MinimumOSVersionmoże to być tak małe, jak 60 MB.
    • Dołączany jest natywny plik wykonywalny.
    • Użycie polecenia Nie łącz jest szybsze w przypadku kompilacji symulatora, ponieważ kompilacja JIT jest używana (w przeciwieństwie do funkcji AOT na urządzeniu).
  • Zestaw SDK linków jest opcją domyślną.
  • Link Wszystkie mogą nie być bezpieczne do użycia, szczególnie jeśli używasz kodu, który nie jest twoim właścicielem takich pakietów NuGet lub składników. Jeśli zdecydujesz się nie łączyć zestawów wszystkich kodów z tych usług są dołączone do aplikacji, potencjalnie tworząc większe aplikacje.
    • Jeśli jednak wybierzesz pozycję Połącz wszystkie aplikacje mogą ulec awarii, szczególnie jeśli są używane składniki zewnętrzne. Wynika to z niektórych składników korzystających z Emocje ion w niektórych typach.
    • Analiza statyczna i odbicie nie działają razem.

Narzędzia można poinstruować, aby zachować elementy wewnątrz aplikacji przy użyciu atrybutu [Preserve].

Jeśli nie masz dostępu do kodu źródłowego lub jest on generowany przez narzędzie i nie chcesz go zmieniać, nadal można go połączyć, tworząc plik XML opisujący wszystkie typy i elementy członkowskie, które muszą zostać zachowane. Następnie możesz dodać flagę --xml={file.name}.xml do opcji projektu, która przetworzyła kod dokładnie tak, jakby używano atrybutów.

Częściowe łączenie aplikacji

Istnieje również możliwość częściowego łączenia aplikacji w celu zoptymalizowania czasu kompilacji aplikacji:

  • Używanie Link All i pomijanie niektórych zestawów

    • Niektóre optymalizacje rozmiaru aplikacji zostaną utracone.
    • Nie jest wymagany dostęp do kodu źródłowego.
    • Na przykład --linkall --linkskip=fieldserviceiOS .
  • Użyj Link SDK opcji i użyj atrybutu [LinkerSafe] w potrzebnych zestawach

    • Wymagany jest dostęp do kodu źródłowego.
    • Informuje system, że zestaw jest bezpieczny do połączenia i jest przetwarzany tak, jakby był to zestaw Xamarin SDK.

Objective-C Powiązania

  • Użycie atrybutu [Assembly: LinkerSafe] w powiązaniach może zaoszczędzić czas i rozmiar.

  • Smartlink

    • Gotowe po stronie natywnej
    • Użyj atrybutu [LinkWith (SmartLink=true)]
    • Pomaga to konsolidatorowi natywnemu wyeliminować kod macierzysty z biblioteki, z którą łączysz.
    • Należy pamiętać, że dynamiczne wyszukiwanie symboli nie będzie z tym działać.

Podsumowanie

W tym przewodniku opisano, jak określić czas aplikacji systemu iOS i opcji, które są zależne od konfiguracji i opcji kompilacji projektu.