Impatto delle opzioni di creazione Xcode "Abilita bitcode" Sì / No


239

Ieri ho riconosciuto un sacco di avvertimenti riguardanti la libreria parse.com:

URGENTE: tutti i bitcode verranno eliminati perché '[percorso] /Parse.framework/Parse (PFAnalytics.o)' è stato creato senza bitcode. È necessario ricostruirlo con bitcode abilitato (impostazione Xcode ENABLE_BITCODE), ottenere una libreria aggiornata dal fornitore o disabilitare il bitcode per questa destinazione. Nota: questo sarà un errore in futuro.

Sono consapevole del fatto che posso rimuovere tali avvisi con questa risposta, ma ora mi chiedo se avrà un impatto negativo sull'invio dell'AppStore e / o sulle prestazioni effettive della mia app.

Xcode ti informa riguardo al bitcode

L'attivazione di questa impostazione indica che la destinazione o il progetto devono generare bitcode durante la compilazione per piattaforme e architetture che lo supportano. Per le build di archivio, il codice bit verrà generato nel file binario collegato per l'invio all'app store. Per altre build, il compilatore e il linker verificheranno se il codice è conforme ai requisiti per la generazione di bitcode, ma non genererà bitcode effettivi. [ENABLE_BITCODE]

Ma non sto ottenendo alcuna informazione davvero utile da questo testo.

  • Posso utilizzare la risposta collegata per aggirare il problema senza alcun impatto negativo e senza compromettere un futuro invio di AppStore?
  • Cosa fa ENABLE_BITCODEeffettivamente, sarà un requisito non facoltativo in futuro?
  • Ci sono impatti sulle prestazioni se lo abilito / disabilito?

Risposte:


399
  • Cosa fa effettivamente ENABLE_BITCODE, sarà un requisito non facoltativo in futuro?

Non sono sicuro a quale livello stai cercando una risposta, quindi facciamo un piccolo viaggio. Alcune di queste potresti già sapere.

Quando costruisci il tuo progetto, Xcode invoca i clangtarget Objective-C e swift/ swiftcper i target Swift. Entrambi questi compilatori compilano l'app in una rappresentazione intermedia (IR), uno di questi IR è bitcode. Da questo IR, prende il sopravvento un programma chiamato LLVM e crea i binari necessari per le modalità x86 a 32 e 64 bit (per il simulatore) e arm6 / arm7 / arm7s / arm64 (per il dispositivo). Normalmente, tutti questi diversi binari sono raggruppati in un unico file chiamato binario grasso .

L'opzione ENABLE_BITCODE interrompe questo passaggio finale. Crea una versione dell'app con un binario IR bitcode. Questo ha una serie di funzioni interessanti, ma un grande svantaggio: non può funzionare da nessuna parte. Per far funzionare un'app con un binario di bitcode, il bitcode deve essere ricompilato ( forse assemblato o transcodificato ... non sono sicuro del verbo corretto ) in un binario x86 o ARM.

Quando un'app bitcode viene inviata all'App Store, Apple eseguirà questo passaggio finale e creerà i file binari finiti.

Al momento, le app di bitcode sono opzionali, ma la storia ha dimostrato che Apple trasforma le cose opzionali in requisiti (come il supporto a 64 bit). Questo di solito richiede alcuni anni, quindi gli sviluppatori di terze parti (come Parse) hanno il tempo di aggiornare.

  • posso usare il metodo sopra senza alcun impatto negativo e senza compromettere un futuro invio di appstore?

Sì, puoi disattivare ENABLE_BITCODE e tutto funzionerà come prima. Fino a quando Apple renderà le app di bitcode un requisito per l'App Store, starai bene.

  • Ci sono impatti sulle prestazioni se lo abilito / disabilito?

Non ci saranno mai impatti negativi sulle prestazioni per abilitarlo, ma la distribuzione interna di un'app per i test potrebbe diventare più complicata.

Per quanto riguarda gli impatti positivi ... beh, è ​​complicato.

Per la distribuzione nell'App Store, Apple creerà versioni separate dell'app per ogni architettura di macchina (arm6 / arm7 / arm7s / arm64) anziché un'app con un binario grasso. Ciò significa che l'app installata sui dispositivi iOS sarà più piccola.

Inoltre, quando il bitcode viene ricompilato ( forse assemblato o transcodificato ... di nuovo, non sono sicuro del verbo corretto ), viene ottimizzato. LLVM lavora sempre alla creazione di nuove ottimizzazioni migliori. In teoria, l'App Store potrebbe ricreare la versione separata dell'app nell'App Store con ogni nuova versione di LLVM, in modo che l'app possa essere ottimizzata di nuovo con la più recente tecnologia LLVM.


19
"Apple creerà versioni separate della tua app per ogni architettura di macchina (arm6 / arm7 / arm7s / arm64) anziché un'app con un binario fat. Ciò significa che l'app installata sui dispositivi iOS sarà più piccola." Questo è ciò che fa Slicing. Questo non è correlato a Bitcode.
user102008

10
"L'opzione ENABLE_BITCODE interrompe questo passaggio finale." Non taglia alcun passo. Tutti i binari di architettura sono ancora prodotti. Le informazioni PLUS bitcode vengono quindi aggiunte per OGNI architettura. Vedere stackoverflow.com/a/31030741/102008
user102008

6
Vedi developer.apple.com/library/prerelease/watchos/documentation/… "L'affettatura è il processo di creazione e consegna di varianti del pacchetto di app per diversi dispositivi di destinazione. Una variante contiene solo l' architettura eseguibile e le risorse necessarie per l'obiettivo dispositivo."
user102008

7
Non è una vera affermazione che abilitare Bitcode renderà l'app installata sul dispositivo più piccola rispetto a quando Bitcode è disabilitato. Da nessuna parte lo dice.
user102008

7
@ onmyway133 Non tutti i fornitori forniscono la fonte. Se tutto ciò che il fornitore fornisce è una lib statica e file di intestazione (o un Framework), allora il fornitore deve avere i propri elementi compilati con bitcode abilitato.
Jeffery Thomas,

65

Assicurati di selezionare "Tutto" per trovare le impostazioni di build del bitcode di abilitazione:

Crea impostazioni


35

Bitcode è una nuova funzionalità di iOS 9

Bitcode è una rappresentazione intermedia di un programma compilato. Le app caricate su iTunes Connect che contengono bitcode verranno compilate e collegate su App Store. L'inclusione di bitcode consentirà ad Apple di riottimizzare il file binario della tua app in futuro senza la necessità di inviare una nuova versione della tua app allo store.

Nota: per le app iOS, il codice di accesso è predefinito, ma facoltativo. Se fornisci bitcode, tutte le app e i framework nel bundle dell'app devono includere bitcode. Per le app watchOS, è richiesto bitcode

Quindi dovresti disabilitare il bitcode fino a quando tutti i framework della tua app non hanno il bitcode abilitato.


"Ottimizza nuovamente il binario della tua app in futuro": puoi spiegarci un po 'di più?
Genaks

Qui dice che: "Bitcode è una nuova funzionalità di iOS 9" e che "[...] Per le app watchOS, è richiesto [...]". Quindi, se mi piacerebbe creare un'app WatchOS su iOS 8?
superpuccio,

33

Bitcode rende più difficile la segnalazione degli arresti anomali . Ecco una citazione da HockeyApp (che vale anche per qualsiasi altra soluzione di segnalazione di incidenti):

Quando si carica un'app sull'App Store e si lascia la casella di controllo "Bitcode" abilitata, Apple utilizzerà quel Bitcode compilandolo e ricompilandolo alla sua estremità prima di distribuirlo ai dispositivi. Ciò comporterà che il binario ottenga un nuovo UUID e c'è un'opzione per scaricare un corrispondente dSYM tramite Xcode.

Nota: la risposta è stata modificata a gennaio 2016 per riflettere le modifiche più recenti


2
Tra settembre e dicembre, questo è riuscito a essere risolto tramite la nuova opzione di esportazione di Xcode Organizer (vedere l'aggiornamento tra le citate istruzioni HA) e interrotto di nuovo (vedi la mia domanda risolta di HA )
Pavel Zdenek,

13

@ vj9 thx. Aggiornamento a xcode 7. Mi mostra lo stesso errore. Costruisci bene dopo aver impostato "NO"

inserisci qui la descrizione dell'immagine

impostare "NO" funziona bene.

inserisci qui la descrizione dell'immagine


1
@Septronic Se si desidera selezionare SÌ. È necessario verificare che tutto il terzo framework supporti questo.
zszen,

La versione iOS minima supportata deve essere iOS 6 o successiva.
superficiale Pensato il

9

Qui puoi trovare tutte le soluzioni relative a Bitcode

Come da Apple Doc

Bitcode è una rappresentazione intermedia di un programma compilato. Le app caricate su iTunes Connect che contengono bitcode verranno compilate e collegate nello store. L'inclusione di bitcode consentirà ad Apple di riottimizzare il file binario della tua app in futuro senza la necessità di inviare una nuova versione della tua app allo store.

Xcode nasconde i simboli generati durante il tempo di creazione per impostazione predefinita, quindi non sono leggibili da Apple. Solo se scegli di includere simboli durante il caricamento della tua app su iTunes Connect, i simboli verranno inviati ad Apple. È necessario includere simboli per ricevere segnalazioni sugli arresti anomali da Apple.

Nota: per le app iOS, il codice di accesso è predefinito, ma facoltativo. Per le app watchOS e tvOS, è richiesto bitcode. Se fornisci bitcode, tutte le app e i framework nel bundle dell'app (tutte le destinazioni nel progetto) devono includere bitcode. Dopo aver distribuito l'app utilizzando iTunes Connect, puoi scaricare il file dSYMs per la build, descritto in Visualizzazione e importazione di arresti anomali nella finestra Dispositivi

Il lancio iniziale di Apple del bitcode e del servizio di assottigliamento delle app è stato sospeso, poiché i problemi di aggiornamento da un tipo di hardware a un diverso tipo di hardware non hanno ripristinato le versioni giuste dei binari. Questo problema è stato successivamente risolto con iOS 9.0.2 e la funzione è stata riattivata.

Bitcode ha sempre fatto parte delle fasi di compilazione e ottimizzazione di LLVM, ma spostando la logica di back-end sui server Apple, sposta le fasi di ottimizzazione e assemblaggio dal tempo di compilazione degli sviluppatori alla distribuzione dell'App Store. Ciò sblocca il potenziale della futura ri-ottimizzazione o della nuova traduzione per supportare processori più recenti e più veloci in futuro. Le distribuzioni di bitcode sono necessarie per i deploment watchOS e tvOS e possono essere abilitate in modo condizionale per le distribuzioni iOS esistenti con l'opzione "Abilita Bitcode" nelle impostazioni del progetto. Ciò aggiungerà un indicatore embed-bitcode-marker per build di debug e embed-bitcode per build di archivi / dispositivi. Questi possono essere passati al compilatore Swift con -embed-bitcode o usando clang con -fembed-bitcode.

Bitcode ha anche alcuni svantaggi.Gli sviluppatori possono eseguire il debug dei rapporti sugli arresti anomali dalle applicazioni archiviando copie dei simboli di debug corrispondenti al file binario che è stato spedito ad Apple. Quando si verifica un arresto anomalo in un determinato stack, lo sviluppatore può ripristinare la traccia dello stack originale simbolizzando il rapporto di arresto anomalo, utilizzando questi simboli di debug. Tuttavia, i simboli sono un sottoprodotto della traduzione della forma intermedia in binario; ma se questo passaggio viene eseguito sul server, questa informazione viene persa. Apple fornisce un servizio di segnalazione degli arresti anomali che può svolgere la parte del debugger, a condizione che lo sviluppatore abbia caricato i simboli di debug al momento della pubblicazione dell'applicazione. Il fatto che lo sviluppatore non veda mai l'esatto binario significa che potrebbero non essere in grado di testare problemi specifici con l'evoluzione del nuovo hardware.

Infine, il bitcode sul server può essere tradotto per supportare nuove architetture e set di istruzioni mentre si evolvono. A condizione che mantengano la convenzione di chiamata e le dimensioni dell'allineamento e delle parole, un'applicazione bitcode potrebbe essere tradotta in diversi tipi di architettura e ottimizzata specificamente per un nuovo processore. Se vengono utilizzate librerie standard per routine matematiche e vettoriali, queste possono essere ottimizzate in istruzioni vettoriali specifiche del processore per ottenere le migliori prestazioni per una determinata applicazione. Gli ottimizzatori potrebbero anche generare più codifiche diverse e giudicare in base alle dimensioni o alla velocità di esecuzione.

Per maggiori informazioni, controlla qui e qui


6

Dai documenti

  • posso usare il metodo sopra senza alcun impatto negativo e senza compromettere un futuro invio di appstore?

Bitcode consentirà a apple di ottimizzare l'app senza che tu debba inviare un'altra build. Tuttavia, puoi abilitare questa funzione solo se tutti i framework e le app nel bundle dell'app hanno questa funzione abilitata. Avere ciò aiuta, ma non averlo non dovrebbe avere alcun impatto negativo.

  • Cosa fa effettivamente ENABLE_BITCODE, sarà un requisito non facoltativo in futuro?

Per le app iOS, il codice di accesso è predefinito, ma facoltativo. Se fornisci bitcode, tutte le app e i framework nel bundle dell'app devono includere bitcode. Per le app watchOS, è richiesto bitcode.

  • Ci sono impatti sulle prestazioni se lo abilito / disabilito?

L'App Store e il sistema operativo ottimizzano l'installazione di app iOS e watchOS adattando la consegna delle app alle funzionalità del dispositivo specifico dell'utente, con un footprint minimo. Questa ottimizzazione, chiamata assottigliamento delle app, consente di creare app che utilizzano la maggior parte delle funzionalità del dispositivo, occupano uno spazio minimo su disco e adattano i futuri aggiornamenti che possono essere applicati da Apple. Download più rapidi e più spazio per altre app e contenuti offrono un'esperienza utente migliore.

Non ci dovrebbero essere impatti sulle prestazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.