Mam problem z osadzonym terminem kodu bitowego.
Co to jest osadzony kod bitowy?
Kiedy włączyć, ENABLE_BITCODE
w nowym Xcode?
Co stanie się z plikiem binarnym po włączeniu ENABLE_BITCODE
w Xcode 7?
Kod bitowy oznacza typ kodu: „Kod bitowy LLVM” wysyłany do iTunes Connect. Dzięki temu Apple może korzystać z niektórych obliczeń w celu dalszej optymalizacji aplikacji (np. Możliwe zmniejszenie rozmiarów plików wykonywalnych). Jeśli Apple musi zmienić plik wykonywalny, może to zrobić bez przesyłania nowej wersji.
Różni się to od: Krojenie, czyli proces optymalizacji przez Apple aplikacji pod kątem rozdzielczości urządzenia i architektury urządzenia użytkownika. Krojenie nie wymaga kodu bitowego. (Np .: w tym tylko @ 2x obrazy na 5s)
App Thinning to połączenie krojenia, kodu bitowego i zasobów na żądanie
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.
Co to jest osadzony kod bitowy?
Według dokumentów :
Aktualizacja: To zdanie w „Nowe funkcje w Xcode 7” uczynił mnie myśleć przez długi czas, że Bitcode jest potrzebna dla Odcinanie zmniejszyć rozmiar aplikacji:
Jednak to nieprawda, Bitcode i Slicing działają niezależnie: Slicing polega na zmniejszaniu rozmiaru aplikacji i generowaniu wariantów pakietów aplikacji, a Bitcode dotyczy pewnych binarnych optymalizacji. Zweryfikowałem to, sprawdzając zawarte architektury w plikach wykonywalnych aplikacji nieobsługujących kodu bitowego i stwierdzając, że zawierają one tylko niezbędne.
Kod bitowy pozwala na inny składnik Thinning aplikacji o nazwie Slicing generować warianty pakietów aplikacji z określonymi plikami wykonywalnymi dla określonych architektur, np. Wariant iPhone'a 5S będzie zawierał tylko plik wykonywalny arm64, iPad Mini armv7 i tak dalej.Kiedy włączyć ENABLE_BITCODE w nowym Xcode?
Co stanie się z plikiem binarnym, gdy ENABLE_BITCODE jest włączony w nowym Xcode?
Z referencji Xcode 7:
Oto kilka linków, które pomogą w lepszym zrozumieniu kodu bitowego :
źródło
Ponieważ dokładne pytanie brzmi „co umożliwia kod bitowy”, chciałbym podać kilka cienkich szczegółów technicznych, które do tej pory odkryłem. Większość tego jest praktycznie niemożliwa do ustalenia ze 100% pewnością, dopóki Apple nie wyda kodu źródłowego dla tego kompilatora
Po pierwsze, kod bitowy Apple się nie pojawia się być tym samym, co kod bajtowy LLVM. Przynajmniej nie udało mi się ustalić między nimi podobieństwa. Wygląda na to, że ma zastrzeżony nagłówek (zawsze zaczyna się od „xar!”) I prawdopodobnie pewną magiczną referencję czasu łącza, która zapobiega duplikowaniu danych. Jeśli wypiszesz ciąg zakodowany na stałe, ciąg ten zostanie wstawiony do danych tylko raz, a nie dwa razy, jak można by oczekiwać, gdyby był to normalny kod bajtowy LLVM.
Po drugie, kod bitowy nie jest tak naprawdę wysyłany do archiwum binarnego jako osobna architektura, jak można się spodziewać. Nie jest dostarczany w taki sam sposób, jak powiedzmy, że x86 i ARM są umieszczone w jednym pliku binarnym (archiwum FAT). Zamiast tego używają specjalnej sekcji w specyficznym dla architektury pliku binarnym MachO o nazwie „__LLVM”, która jest dostarczana z każdą obsługiwaną architekturą (tj. Powieloną). Zakładam, że jest to niedługo z ich systemem kompilatora i może zostać naprawiony w przyszłości, aby uniknąć powielania.
Kod C (skompilowany z
clang -fembed-bitcode hi.c -S -emit-llvm
):Wyjście LLVM IR:
Tablica danych w IR również zmienia się w zależności od optymalizacji i innych ustawień generowania kodu clang. Nie jest dla mnie całkowicie wiadomo, w jakim formacie lub czymkolwiek on jest.
EDYTOWAĆ:
Po wskazówkach na Twitterze postanowiłem ponownie to sprawdzić i potwierdzić. Śledziłem ten post na blogu i użyłem jego narzędzia do wyodrębniania kodu bitowego, aby pobrać plik binarny Apple Archive z pliku wykonywalnego MachO. Po rozpakowaniu archiwum Apple za pomocą narzędzia xar dostałem to (oczywiście przekonwertowane na tekst za pomocą llvm-dis)
Jedyną zauważalną różnicą między IR bez kodu bitowego i IR z kodem bitowym jest to, że nazwy plików zostały zredukowane do 1, 2 itd. Dla każdej architektury.
Potwierdziłem również, że kod bitowy osadzony w pliku binarnym jest generowany po optymalizacji. Jeśli skompilujesz z -O3 i wyodrębnisz kod bitowy, będzie inaczej niż w przypadku kompilacji z -O0.
Aby uzyskać dodatkowe środki, potwierdziłem również, że Apple nie wysyła kodu bitowego do urządzeń podczas pobierania aplikacji na system iOS 9. Zawierają one szereg innych dziwnych sekcji, których nie rozpoznałem, jak __LINKEDIT, ale nie zawierają pakietu __LLVM .__, a zatem nie zawierają kodu bitowego w końcowym pliku binarnym działającym na urządzeniu. Co dziwne, Apple wciąż wysyła duże pliki binarne z oddzielnym kodem 32/64-bitowym na urządzenia z systemem iOS 8.
źródło
xar!
jest to format pliku archiwum Apple.Zasadniczo ta koncepcja jest nieco podobna do java, w której kod bajtowy jest uruchamiany na różnych maszynach JVM, w tym przypadku kod bitowy jest umieszczany w sklepie iTune i zamiast podawać kod pośredni różnym platformom (urządzeniom), zapewnia skompilowany kod, który nie potrzebuje dowolna maszyna wirtualna do uruchomienia.
Dlatego musimy raz utworzyć kod bitowy i będzie on dostępny dla istniejących lub przyszłych urządzeń. Ból głowy Apple to kompilacja i dostosowanie go do każdej platformy.
Twórcy nie muszą wprowadzać zmian i ponownie przesyłać aplikacji w celu obsługi nowych platform.
Weźmy przykład iPhone'a 5s, gdy Apple wprowadziło
x64
w nim chip. Chociażx86
aplikacje były całkowicie kompatybilne zx64
architekturą, ale aby w pełni wykorzystaćx64
platformę, programista musi zmienić architekturę lub jakiś kod. Po zakończeniu aplikacji aplikacja zostanie przesłana do sklepu z aplikacjami w celu sprawdzenia.Jeśli ta koncepcja kodu bitowego została uruchomiona wcześniej, my, programiści, nie musimy wprowadzać żadnych zmian w celu obsługi
x64
architektury bitowej.źródło
Aktualizacja
Apple wyjaśniło, że krojenie odbywa się niezależnie od włączenia kodu bitowego. Zauważyłem to również w praktyce, gdy aplikacja nieobsługująca kodu bitowego zostanie pobrana tylko jako architektura odpowiednia dla urządzenia docelowego.
Oryginalny
W szczególności :
Sposób, w jaki to czytam, jeśli obsługujesz kod bitowy, osoby pobierające twoją aplikację otrzymają tylko skompilowaną architekturę potrzebną do ich własnego urządzenia.
źródło