Wpływ opcji kompilacji Xcode „Włącz kod bitowy” Tak / Nie

239

Wczoraj rozpoznałem mnóstwo ostrzeżeń dotyczących biblioteki parse.com:

PILNE: cały kod bitowy zostanie usunięty, ponieważ „[ścieżka] /Parse.framework/Parse (PFAnalytics.o)” został zbudowany bez kodu bitowego. Musisz go odbudować z włączonym kodem bitowym (ustawienie Xcode ENABLE_BITCODE), uzyskać zaktualizowaną bibliotekę od dostawcy lub wyłączyć kod bitowy dla tego celu. Uwaga: w przyszłości będzie to błąd.

Wiem, że dzięki tej odpowiedzi mogę usunąć te ostrzeżenia, ale teraz zastanawiam się, czy będzie to miało negatywny wpływ na przesłanie AppStore i / lub faktyczne działanie mojej aplikacji.

Xcode informuje Cię o kodzie bitowym

Aktywacja tego ustawienia wskazuje, że cel lub projekt powinien generować kod bitowy podczas kompilacji dla platform i architektur, które go obsługują. W przypadku kompilacji archiwów kod bitowy zostanie wygenerowany w połączonym pliku binarnym w celu przesłania do sklepu z aplikacjami. W przypadku innych wersji kompilator i konsolidator sprawdzi, czy kod jest zgodny z wymaganiami dotyczącymi generowania kodu bitowego, ale nie wygeneruje faktycznego kodu bitowego. [ENABLE_BITCODE]

Ale nie otrzymuję żadnych naprawdę przydatnych informacji z tego tekstu.

  • Czy mogę użyć połączonej odpowiedzi w celu obejścia problemu bez negatywnego wpływu i bez narażania na szwank przyszłego przesłania AppStore?
  • Co ENABLE_BITCODEfaktycznie zrobi, czy będzie to wymóg nieobowiązkowy w przyszłości?
  • Czy wpływ na wydajność ma wpływ na włączenie / wyłączenie?
luk2302
źródło

Odpowiedzi:

399
  • Co faktycznie robi ENABLE_BITCODE, czy będzie to wymóg nieobowiązkowy w przyszłości?

Nie jestem pewien, na jakim poziomie szukasz odpowiedzi, więc weźmy małą wycieczkę. Niektóre z nich możesz już znać.

Podczas budowania projektu Xcode wywołuje clangcele Objective-C i swift/ swiftclub Swift. Oba kompilatory kompilują aplikację do pośredniej reprezentacji (IR), jedną z tych IR jest kod bitowy. Z tego IR, program o nazwie LLVM przejmuje i tworzy pliki binarne potrzebne dla trybów 32 i 64-bitowych x86 (dla symulatora) i arm6 / arm7 / arm7s / arm64 (dla urządzenia). Zwykle wszystkie te różne pliki binarne są skupione w jednym pliku o nazwie gruby plik binarny .

Opcja ENABLE_BITCODE odcina ten ostatni krok. Tworzy wersję aplikacji z kodem binarnym IR. Ma wiele fajnych funkcji, ale ma jedną wielką wadę: nie można go nigdzie uruchomić. Aby uzyskać aplikację z binarnym kodem bitowym do uruchomienia, kod bitowy musi zostać ponownie skompilowany ( być może złożony lub transkodowany ... Nie jestem pewien poprawnego czasownika ) na plik binarny x86 lub ARM.

Gdy aplikacja z kodem bitowym zostanie przesłana do App Store, Apple zrobi ten ostatni krok i utworzy gotowe pliki binarne.

W tej chwili aplikacje z kodem bitowym są opcjonalne, ale historia pokazała, że ​​Apple zmienia opcjonalne rzeczy w wymagania (np. Obsługa 64 bitów). Zwykle zajmuje to kilka lat, więc programiści zewnętrzni (tacy jak Parse) mają czas na aktualizację.

  • czy mogę zastosować powyższą metodę bez żadnego negatywnego wpływu i bez narażania na szwank przyszłego przesyłania aplikacji?

Tak, możesz wyłączyć ENABLE_BITCODE i wszystko będzie działać tak jak wcześniej. Dopóki Apple nie uczyni aplikacji z kodem bitowym wymaganiem dla App Store, wszystko będzie dobrze.

  • Czy wpływ na wydajność ma wpływ na włączenie / wyłączenie?

Włączenie nigdy nie będzie miało negatywnego wpływu na wydajność, ale wewnętrzna dystrybucja aplikacji do testowania może się bardziej skomplikować.

Jeśli chodzi o pozytywne skutki… to skomplikowane.

W celu dystrybucji w App Store Apple utworzy osobne wersje aplikacji dla każdej architektury maszyny (arm6 / arm7 / arm7s / arm64) zamiast jednej aplikacji z grubym plikiem binarnym. Oznacza to, że aplikacja zainstalowana na urządzeniach z iOS będzie mniejsza.

Ponadto, gdy kod bitowy zostanie ponownie skompilowany ( może być złożony lub transkodowany… ponownie, nie jestem pewien, czy czasownik jest poprawny ), jest on zoptymalizowany. LLVM zawsze pracuje nad tworzeniem nowych, lepszych optymalizacji. Teoretycznie App Store może odtworzyć osobną wersję aplikacji w App Store przy każdej nowej wersji LLVM, dzięki czemu można ponownie zoptymalizować aplikację za pomocą najnowszej technologii LLVM.

Jeffery Thomas
źródło
19
„Apple utworzy osobne wersje aplikacji dla każdej architektury maszyny (arm6 / arm7 / arm7s / arm64) zamiast jednej aplikacji z grubym plikiem binarnym. Oznacza to, że aplikacja zainstalowana na urządzeniach z iOS będzie mniejsza”. Tak właśnie działa Slicing. Nie ma to związku z kodem bitowym.
user102008,
10
„Opcja ENABLE_BITCODE odcina ten ostatni krok.” Nie wycina żadnego kroku. Wszystkie binarne architektury są nadal produkowane. Informacje o kodzie bitowym PLUS są następnie dodawane do KAŻDEJ architektury. Zobacz stackoverflow.com/a/31030741/102008
użytkownik102008
6
Zobacz developer.apple.com/library/prerelease/watchos/documentation/… „Krojenie to proces tworzenia i dostarczania wariantów pakietu aplikacji dla różnych urządzeń docelowych. Wariant zawiera tylko architekturę wykonywalną i zasoby potrzebne do celu urządzenie."
user102008
7
Nie jest prawdą, że włączenie Bitcode sprawi, że aplikacja zainstalowana na urządzeniu będzie mniejsza niż w przypadku wyłączenia Bitcode. Nigdzie to nie mówi.
user102008,
7
@ onmyway133 Nie wszyscy dostawcy zapewniają źródła. Jeśli wszystko, co zapewnia dostawca, to statyczna biblioteka lib i pliki nagłówkowe (lub Framework), wówczas dostawca musi mieć skompilowane pliki z włączonym kodem bitowym.
Jeffery Thomas
65

Pamiętaj, aby wybrać opcję „Wszystkie”, aby znaleźć ustawienia włączania kompilacji kodu bitowego:

Ustawienia kompilacji

Punkt gamma
źródło
35

Kod bitowy to nowa funkcja iOS 9

Kod bitowy jest pośrednią reprezentacją skompilowanego programu. Aplikacje przesyłane do iTunes Connect zawierające kod bitowy zostaną skompilowane i połączone w App Store. Dołączenie kodu bitowego pozwoli Apple ponownie zoptymalizować aplikację binarną w przyszłości, bez konieczności przesyłania nowej wersji aplikacji do sklepu.

Uwaga: w aplikacjach na iOS kod bitowy jest domyślny, ale opcjonalny. Jeśli podasz kod bitowy, wszystkie aplikacje i ramy w pakiecie aplikacji muszą zawierać kod bitowy. W przypadku aplikacji watchOS wymagany jest kod bitowy

Dlatego należy wyłączyć kod bitowy, dopóki wszystkie środowiska aplikacji nie będą miały włączonego kodu bitowego.

agy
źródło
„Ponownie zoptymalizuj aplikację binarną w przyszłości” - czy możesz wyjaśnić coś więcej?
genaks
Tutaj napisano: „Bitcode to nowa funkcja iOS 9” i „[...] W przypadku aplikacji watchOS wymagany jest kod bitowy [...]”. A co jeśli chciałbym stworzyć aplikację WatchOS na iOS 8?
superpuccio
33

Kod bitowy utrudnia zgłaszanie awarii . Oto cytat z HockeyApp (który dotyczy również wszystkich innych rozwiązań raportowania awarii):

Podczas przesyłania aplikacji do App Store i pozostawienia zaznaczonego pola wyboru „Bitcode”, Apple użyje tej kompilacji Bitcode i ponownie skompiluje ją na swoim końcu, zanim roześle ją na urządzenia. Spowoduje to, że plik binarny otrzyma nowy identyfikator UUID, a także istnieje możliwość pobrania odpowiedniego dSYM przez Xcode.

Uwaga: odpowiedź została zredagowana w styczniu 2016 roku, aby odzwierciedlić najnowsze zmiany

Alexander Wasenin
źródło
2
Pomiędzy wrześniem a grudniem udało się to naprawić za pomocą nowej opcji eksportu Xcode Organizer (patrz aktualizacja w cytowanym howto HA) i ponownie zepsuć (patrz moje rozwiązane pytanie HA )
Pavel Zdenek
13

@ vj9 thx. Aktualizuję do Xcode 7. Pokazuje mi ten sam błąd. Buduj dobrze po ustawieniu „NIE”

wprowadź opis zdjęcia tutaj

ustaw „NIE”, działa dobrze.

wprowadź opis zdjęcia tutaj

zszen
źródło
1
@Septronic Jeśli chcesz wybrać TAK. Musisz sprawdzić, czy obsługują to wszystkie Twoje trzecie ramy.
zszen
Docelowa minimalna obsługiwana wersja systemu iOS musi mieć system iOS 6 lub nowszy.
shallow Myśl
9

Tutaj znajdziesz wszystkie rozwiązania dotyczące kodu bitowego

Zgodnie z Apple Doc

Kod bitowy jest pośrednią reprezentacją skompilowanego programu. Aplikacje przesyłane do iTunes Connect zawierające kod bitowy zostaną skompilowane i połączone w sklepie. Dołączenie kodu bitowego pozwoli Apple ponownie zoptymalizować aplikację binarną w przyszłości, bez konieczności przesyłania nowej wersji aplikacji do sklepu.

Xcode domyślnie ukrywa symbole generowane podczas kompilacji, więc nie są one czytelne dla Apple. Symbole zostaną przesłane do Apple tylko wtedy, gdy zdecydujesz się dołączyć symbole podczas przesyłania aplikacji do iTunes Connect. Aby otrzymywać raporty o awariach od Apple, musisz dołączyć symbole.

Uwaga: w aplikacjach na iOS kod bitowy jest domyślny, ale opcjonalny. W przypadku aplikacji watchOS i tvOS wymagany jest kod bitowy. Jeśli podasz kod bitowy, wszystkie aplikacje i ramy w pakiecie aplikacji (wszystkie cele w projekcie) muszą zawierać kod bitowy. Po rozpowszechnieniu aplikacji za pomocą iTunes Connect możesz pobrać plik dSYM dla kompilacji opisany w sekcji Wyświetlanie i importowanie awarii w oknie Urządzenia

Pierwsze wdrożenie przez Apple usługi bitcode i przerzedzania aplikacji zostało zawieszone, ponieważ problemy z uaktualnieniem z jednego typu sprzętu do innego typu sprzętu nie przywróciły odpowiednich wersji plików binarnych. Ten problem został następnie rozwiązany w systemie iOS 9.0.2 i funkcja została ponownie włączona.

Kod bitowy zawsze był częścią faz kompilacji i optymalizacji LLVM, ale przenosząc logikę zaplecza na serwery Apple, przenosi fazy optymalizacji i składania z czasu kompilacji programisty do wdrożenia App Store. Uwalnia to potencjał przyszłej ponownej optymalizacji lub ponownej translacji w celu obsługi nowszych i szybszych procesorów w przyszłości. Wdrożenia kodu bitowego są wymagane w przypadku wdrożeń watchOS i tvOS i można je warunkowo włączyć dla istniejących wdrożeń systemu iOS za pomocą opcji „Włącz kod bitowy” w ustawieniach projektu. Spowoduje to dodanie znacznika embed-bitcode-marker do kompilacji debugowania i embed-bitcode do kompilacji archiwum / urządzenia. Można je przekazać do kompilatora Swift za pomocą -embed-bitcode lub za pomocą clang z -fembed-bitcode.

Kod bitowy ma również pewne wady.Programiści mogą debugować raporty o awariach z aplikacji, przechowując kopie symboli debugowania odpowiadających plikom binarnym dostarczonym do Apple. Gdy awaria ma miejsce w danym stosie, programista może przywrócić oryginalny ślad stosu, symbolizując raport awarii, używając tych symboli debugowania. Jednak symbole są produktem ubocznym tłumaczenia pośredniej postaci na binarną; ale jeśli ten krok zostanie wykonany na serwerze, informacje te zostaną utracone. Apple zapewnia usługę raportowania awarii, która może odgrywać rolę debuggera, pod warunkiem, że programista przesłał symbole debugowania w momencie publikacji aplikacji. Fakt, że deweloper nigdy nie widzi dokładnego pliku binarnego, oznacza, że ​​może nie być w stanie przetestować określonych problemów w miarę ewolucji nowego sprzętu.

Wreszcie kod bitowy na serwerze może zostać przetłumaczony w celu obsługi nowych architektur i zestawów instrukcji w miarę ich ewolucji. Pod warunkiem, że zachowają konwencję wywoływania oraz rozmiar wyrównania i słów, aplikacja kodu bitowego może zostać przetłumaczona na różne typy architektury i zoptymalizowana specjalnie pod kątem nowego procesora. Jeśli używane są standardowe biblioteki dla procedur matematycznych i wektorowych, można je zoptymalizować do instrukcji wektorowych specyficznych dla procesora, aby uzyskać najlepszą wydajność dla danej aplikacji. Optymalizatory mogą nawet generować wiele różnych kodowań i oceniać na podstawie wielkości lub szybkości wykonywania.

Aby uzyskać więcej informacji, sprawdź tutaj i tutaj

Rex
źródło
6

Z dokumentów

  • czy mogę zastosować powyższą metodę bez żadnego negatywnego wpływu i bez narażania na szwank przyszłego przesyłania aplikacji?

Kod bitowy pozwoli Apple zoptymalizować aplikację bez konieczności przesyłania kolejnej wersji. Możesz jednak włączyć tę funkcję tylko wtedy, gdy wszystkie frameworki i aplikacje w pakiecie aplikacji mają tę funkcję włączoną. Posiadanie tego pomaga, ale nie posiadanie go nie powinno mieć żadnego negatywnego wpływu.

  • Co faktycznie robi ENABLE_BITCODE, czy będzie to wymóg nieobowiązkowy w przyszłości?

W aplikacjach na iOS kod bitowy jest domyślny, ale opcjonalny. Jeśli podasz kod bitowy, wszystkie aplikacje i ramy w pakiecie aplikacji muszą zawierać kod bitowy. W przypadku aplikacji watchOS wymagany jest kod bitowy.

  • Czy wpływ na wydajność ma wpływ na włączenie / wyłączenie?

App Store i system operacyjny optymalizują instalację aplikacji iOS i watchOS, dostosowując dostarczanie aplikacji do możliwości konkretnego urządzenia użytkownika, przy minimalnym obciążeniu. Ta optymalizacja, zwana przerzedzaniem aplikacji, pozwala tworzyć aplikacje, które wykorzystują najwięcej funkcji urządzenia, zajmują minimalną ilość miejsca na dysku i są przystosowane do przyszłych aktualizacji, które Apple może zastosować. Szybsze pobieranie i więcej miejsca na inne aplikacje i treści zapewnia lepszą obsługę.

Nie powinno to wpływać na wydajność.

vj9
źródło