2015-08-14 6 views

risposta

14

Tutte queste informazioni sono contenute nella mappa di collegamento, se avete la pazienza per passare al setaccio esso (per le app di grandi dimensioni, può essere abbastanza grande). La mappa dei collegamenti contiene un elenco di tutte le librerie, i loro file oggetto e tutti i simboli che sono stati inseriti nella tua app, il tutto in un testo leggibile. Normalmente, i progetti non sono configurati per generarli di default, quindi dovrai fare una rapida modifica del file di progetto.

Dall'interno Xcode:

  1. Sotto 'costruire Impostazioni' per il vostro obiettivo, ricerca per "mappare"
  2. Nei risultati qui sotto, nella sezione 'Linking', impostare 'Write link Mappa del file' "Sì"
  3. Assicurati di annotare il nome completo di percorso e file elencato sotto 'percorso CARTOGRAFIA File'

la prossima volta che si genera la vostra applicazione potrai ottenere una mappa di collegamento oggetto di dumping quel percorso di file. Tieni presente che il percorso è relativo all'ubicazione della tua app nella cartella DerivedData (solitamente ~/Library/Developer/Xcode/DerivedData/<your-app-name>-<random-string-of-letters-and-numbers>/Build/Intermediates/..., ma YMMV). Poiché si tratta solo di un file di testo, puoi leggerlo con qualsiasi editor di testo.

Il contenuto della mappa di collegamento sono divisi in 3 sezioni, di cui 2 saranno pertinenti a ciò che stai cercando:

  1. oggetto file: questa sezione contiene un elenco di tutti i file oggetto incluso nella tua app finale, incluso il tuo codice personale e quello di tutte le librerie di terze parti che hai incluso. È importante sottolineare che ogni file oggetto elenca anche la libreria da cui proviene;
  2. Sezioni: questa sezione, non pertinente alla domanda, contiene un elenco dei segmenti del processore e delle relative sezioni;
  3. Simboli: questa sezione contiene i dati non elaborati a cui sei interessato: un elenco di tutti i simboli/metodi con la loro posizione assoluta (ovvero l'indirizzo nella mappa della memoria del processore), la dimensione e, soprattutto, una croce riferimento al loro modulo oggetto contenente (sotto la colonna 'File').

Da questi dati grezzi, si dispone di tutto ciò che è necessario per eseguire il calcolo della dimensione richiesta. Dal n. 1, vedi che, per ogni libreria, ci sono N possibili moduli oggetto costitutivo; dal n. 2, vedi che, per ogni modulo oggetto, ci sono M simboli possibili, ognuno dei quali occupa una dimensione S. Per ogni libreria data, il tuo ordine approssimativo di dimensioni sarà qualcosa come O (N * M * S). Questo è solo per darti un'indicazione dei componenti che andrebbero nei tuoi calcoli effettivi, non è una sorta di formula utile. Per eseguire il calcolo stesso, mi dispiace dire che non sono a conoscenza di strumenti esistenti che eseguiranno l'elaborazione richiesta per te, ma dal momento che la mappa dei collegamenti è solo un file di testo, con un po 'di magia di script e ingenuità puoi costruire una sceneggiatura per fare il pesante sollevamento. Ad esempio, ho un piccolo progetto di esempio che si collega alla seguente libreria: https://github.com/ColinEberhardt/LinqToObjectiveC (il progetto di esempio è tratto da un bel tutorial su ReactiveCocoa, qui: http://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1) e voglio sapere quanto spazio occupa. Ho generato una mappa dei collegamenti, TwitterInstant-LinkMap-normal-x86_64.txt (viene eseguita nel simulatore).Al fine di trovare tutti i moduli di oggetto inclusi dalla libreria, faccio questo:

$ grep -i "libLinqToObjectiveC.a" TwitterInstant-LinkMap-normal-x86_64.txt 

che mi dà questo:

[ 8] /Users/Smyrl/Library/Developer/Xcode/DerivedData/TwitterInstant-ecppmzhbawtxkwctokwryodvgkur/Build/Products/Debug-iphonesimulator/libLinqToObjectiveC.a(LinqToObjectiveC-dummy.o) 
[ 9] /Users/Smyrl/Library/Developer/Xcode/DerivedData/TwitterInstant-ecppmzhbawtxkwctokwryodvgkur/Build/Products/Debug-iphonesimulator/libLinqToObjectiveC.a(NSArray+LinqExtensions.o) 
[ 10] /Users/Smyrl/Library/Developer/Xcode/DerivedData/TwitterInstant-ecppmzhbawtxkwctokwryodvgkur/Build/Products/Debug-iphonesimulator/libLinqToObjectiveC.a(NSDictionary+LinqExtensions.o) 

La prima colonna contiene i riferimenti incrociati con la tabella dei simboli di cui ho bisogno , in modo da poter cercare quelli:

$ cat TwitterInstant-LinkMap-normal-x86_64.txt | grep -e "\[ 8\]" 

che mi dà:

0x100087161 0x0000001B [ 8] literal string: PodsDummy_LinqToObjectiveC 
0x1000920B8 0x00000008 [ 8] anon 
0x100093658 0x00000048 [ 8] l_OBJC_METACLASS_RO_$_PodsDummy_LinqToObjectiveC 
0x1000936A0 0x00000048 [ 8] l_OBJC_CLASS_RO_$_PodsDummy_LinqToObjectiveC 
0x10009F0A8 0x00000028 [ 8] _OBJC_METACLASS_$_PodsDummy_LinqToObjectiveC 
0x10009F0D0 0x00000028 [ 8] _OBJC_CLASS_$_PodsDummy_LinqToObjectiveC 

La seconda colonna contiene la dimensione del simbolo in questione (in esadecimale), quindi se li aggiungo tutti, ottengo 0x103 o 259 byte.

Ancora meglio, posso fare un po 'di flusso di hacking di whittle giù agli elementi essenziali e fare l'aggiunta per me:

$ cat TwitterInstant-LinkMap-normal-x86_64.txt | grep -e "\[ 8\]" | grep -e "0x" | awk '{print $2}' | xargs printf "%d\n" | paste -sd+ - | bc 

che mi dà il numero verso l'alto:

259 

Fare lo stesso per "\[ 9\]" (13016 byte) e "\[ 10\]" (5503 byte) e aggiungerli ai precedenti 259 byte, mi dà 18778 byte.

È possibile migliorare l'hacking dello stream che ho fatto per renderlo un po 'più robusto (in questa implementazione, devi assicurarti di ottenere il numero esatto di spazi a destra e di quotare le parentesi), ma tu almeno avere l'idea.

+0

Grazie per la tua fantastica risposta, proverò a scrivere qualcosa per calcolare le taglie fornite. –

+0

Scusa per aver approfondito questo argomento, ma questo [SO] (http://stackoverflow.com/questions/2003534/how-to il progetto -fut-out-how-many-line-of-code-there-are-in-an-xcode) può anche essere un'alternativa per i conteggi esatti – Ethenyl

+0

@Ethenyl, che funzionerebbe solo se si ha la sorgente effettiva codice per la libreria di terze parti in questione, che molto spesso non è il caso. – fullofsquirrels

0

crea l'app in xcode.

quindi utilizzare il finder per esplorare il contenuto, che dovrebbe fornire sufficienti informazioni su ciò che è incluso.

0

penso che si dovrebbe essere in grado di estrarre le informazioni necessarie da questo:

simboli w -noSources YourFileHere

Rif: https://devforums.apple.com/message/926442#926442

IIRC, non è sta per darvi Cancella le informazioni di riepilogo su ogni lib, ma dovresti trovare che le funzioni di ogni libreria devono essere raggruppate insieme, quindi con un po 'di sforzo puoi calcolare il contributo approssimativo di ciascuna lib:

+0

Il collegamento esterno sembra non funzionare più. – xpereta

+0

Il collegamento esterno sembra funzionare di nuovo ora dopo essere stato inattivo per un po '(è necessario effettuare il login). Era presumibilmente un problema temporaneo con i forum di Apple. – Columbo

0

Assicurati anche che al tuo set Genera simboli di debug su NO nelle impostazioni di generazione. Questo può ridurre la dimensione della tua libreria statica di circa il 30%.

Nel caso in cui sia parte della vostra preoccupazione, una libreria statica è solo i file .o pertinenti archiviati insieme più un po 'di contabilità. Quindi una libreria statica da 1.7 MB - anche se il codice al suo interno è l'intero 1.7mb - di solito non aggiunge 1.7mb al tuo prodotto. Si applicano le solite regole sulla rimozione del codice morto.

Oltre a ciò è possibile ridurre le dimensioni del codice. Il seguente probabilmente non è un elenco completo.

Nelle impostazioni di generazione del target cercare "Livello di ottimizzazione". Passando a "Fastest, Smallest -Os" si consente al compilatore di sacrificare una certa velocità per le dimensioni.

Assicurati di costruire per il pollice, il codice ARM più compatto. Supponendo che tu stia usando LLVM significa assicurarsi di non avere -mno-thumb ovunque nelle impostazioni del tuo progetto.

Considerare anche quali architetture si desidera creare. Apple non consente l'invio di un'app che supporta sia ARMv6 che lo schermo dell'iPhone 5 e ha abbandonato completamente il supporto ARMv6 dall'ultimo Xcode. Quindi probabilmente non ha senso includere questo a questo punto.

+0

Abbiamo deciso di usare swift. Aggiunge 5 - 8 MB. :( –

0

C'è un'app davvero semplice, chiamata OmniDiskSweeper, fondamentalmente per trovare file pesanti nel tuo disco rigido, ma basta navigare verso la tua build e controllare i file all'interno. Ma non credo che le biblioteche siano le responsabili, potrebbero esserci anche delle grandi immagini. Io uso sempre uno strumento chiamato ImageOptim https://imageoptim.com/ per comprimere tutte le immagini nei miei progetti, è così utile in quanto le immagini sono compresse fino al 99% con la stessa qualità. Per utilizzare lo strumento basta scaricarlo e installarlo e digitare questo dal vostro terminale (nella cartella del progetto):

open -a ImageOptim . 
5

Crea un file .ipa della tua app e salvalo nel tuo sistema.

Quindi aprire il terminale ed eseguire il seguente comando:

decomprimere -lv /path/to/your/app.ipa

Si restituirà una tabella di dati sulla tua .ipa file. La colonna delle dimensioni ha la dimensione compressa di ogni file nel tuo file .ipa.