Cambia menu

Suggerimenti per gli sviluppatori Android per ridurre le dimensioni del file APK

Pubblicato: 2015-10-28
Ecco una serie di consigli per i miei colleghi sviluppatori Android per ridurre l'impronta statica. Puoi scegliere quelli che si adattano meglio alle tue esigenze particolari.

1) ProGuard

Assumi Freelancer su Truelancer

Uno strumento per la riduzione del codice, come ProGuard, ridurrà notevolmente le dimensioni del file APK. Lo strumento è disponibile su sourceforge. Si noti che è molto importante testare nuovamente tutta l'applicazione dopo aver applicato ProGuard poiché a volte potrebbe cambiare il comportamento dell'applicazione. Poiché ProGuard sostituisce i simboli dell'applicazione, per rendere il codice difficile da leggere, è importante mantenere la mappatura dei simboli, in modo da poter riportare una traccia dello stack ai simboli originali se è necessario indagare su un arresto anomalo dell'applicazione.

2) Rimozione delle informazioni di debug

Ti consiglio di rimuovere dall'applicazione tutte le funzionalità relative al debug. L'applicazione generalmente non vede o utilizza questi dati e il sistema operativo Android non lo richiede per eseguire l'applicazione. Pertanto, le informazioni di debug sprecano solo spazio e dovrebbero essere rimosse.

Per ottenere ciò, tutte le funzionalità relative al debug devono essere racchiuse in blocchi condizionali, come di seguito:

 debug finale statico = falso;
 se (debug) {
 v(TAG, "Debug...")
 }

È importante che il flag di debug sia impostato in fase di compilazione (cioè dichiarato come statico finale) affinché il compilatore possa rimuovere completamente tutte le funzionalità di debug. Creare il proprio metodo di debug come quello mostrato di seguito non è una buona idea perché la chiamata a myDebugPrint() non è racchiusa da un blocco condizionale, il che significa che il compilatore deve conservare le informazioni su myDebugPrint() nella classe chiamante.

 public void myDebugPrint()
se (debug)
v(TAG, "Debug...");
}
}
…
mioDebugStampa()

3) Rimozione dei simboli di debug dalle librerie native L'utilizzo dei simboli di debug ha senso se l'applicazione è ancora in fase di sviluppo e richiede ancora il debug. Ma se i simboli di debug vengono ancora visualizzati quando si compila una build di rilascio e se si desidera rimuoverli, si consiglia di rimuovere i simboli di debug dalle librerie native (file .so). Questo viene fatto usando il comando arm-eabi-strip, da Android NDK.

4) Formati multimediali consigliati Se la tua applicazione fa molto affidamento su immagini, audio o video, un altro modo per ridurre le dimensioni del file APK è utilizzare determinati formati multimediali. Ti consigliamo di utilizzare i seguenti formati multimediali per immagini, audio e video:

  • Video: utilizzare H264 AVC. Codifica il video a una risoluzione non maggiore della risoluzione dello schermo del dispositivo di destinazione (se noto).
  • Audio : l'audio AAC è consigliato per tutte le risorse audio. AAC ottiene una migliore compressione a una data qualità, rispetto a mp3 o Ogg Vorbis. I formati grezzi come WAV non dovrebbero mai essere usati. La logica comune per l'utilizzo del formato WAV è che la decodifica di flussi audio compressi di solito significa un'elevata latenza durante la riproduzione. Tuttavia, Android fornisce l'API Sound Pool che consente alle applicazioni di utilizzare flussi audio compressi senza la penalità dell'elevata latenza.
  • Immagini : PNG o JPEG. Usa PNG; poiché è un formato senza perdita di dati, è molto adatto per trame e grafica in quanto non ci saranno artefatti visivi dalla compressione. Se ci sono vincoli di spazio, usa JPEG o una combinazione di PNG e JPEG. Un'immagine JPEG di alta qualità può funzionare correttamente per immagini fotorealistiche di grandi dimensioni, per le quali lo schema di compressione JPEG è ottimizzato.
  • Ottimizza le dimensioni dei PNG senza perdere la qualità

Devi leggere 5 risoluzioni finanziarie da impostare nel 2015

Se utilizzi il formato PNG, le dimensioni del file delle immagini PNG possono essere ridotte senza perdere la qualità. Per fare ciò, usa uno strumento come OptiPNG o PNGCrush. Entrambi sono ottimi per ridurre le dimensioni del file PNG pur garantendo la qualità dell'immagine. PNGcrush è un programma open source che esegue l'iterazione sui filtri PNG e sui parametri zlib (Deflate), comprime l'immagine ripetutamente utilizzando la configurazione di ogni parametro e sceglie la configurazione che produce l'output più piccolo compresso (IDAT). D'altra parte, OptiPNG esegue le prove interamente in memoria e scrive solo il file di output finale sul disco. Inoltre, offre all'utente più impostazioni predefinite di ottimizzazione.

5) Rimuovere le risorse inutilizzate Un altro potenziale gruppo di sprechi di spazio da considerare per la rimozione dal file APK sono le risorse inutilizzate nella directory res, come layout, drawable e colori inutilizzati. Per rilevare le risorse inutilizzate nel tuo APK che potrebbero essere rimosse, utilizza lo strumento Android-unused-resources. Risorse inutilizzate Android è un'applicazione Java che eseguirà la scansione del progetto per le risorse inutilizzate.

6) Evita la duplicazione Assicurarsi che la tua applicazione non abbia funzionalità duplicate o risorse duplicate è un modo ovvio per evitare di avere file non necessari nell'APK. È importante capire quali API Android utilizzi e le funzionalità complete fornite da ciascuna. Potrebbe essere che un'API Android stia già eseguendo il lavoro di un'altra API. Anche le risorse duplicate (stringhe, bitmap, ecc.) sono uno spreco di spazio e possono essere facilmente evitate. In misura minore, il codice duplicato aumenterà anche inutilmente la dimensione del file binario consegnato.

7) Riduci il numero di metodi Gli sviluppatori Android accaniti hanno dovuto affrontare un problema che provoca mal di testa con le loro app. Il numero di metodi che un'app può avere è limitato. Beh, una volta era limitato. Alla fine, la brava gente di Google ha fornito una soluzione lo scorso ottobre, ma era tutt'altro che l'ideale. Sebbene molto facile da implementare, la soluzione multidex ha complicato e prolungato notevolmente i tempi di compilazione. Non fermandosi, a partire da Lollipop (Android 5.0), l'intera macchina virtuale Android è stata rivoluzionata per offrire una soluzione molto più sopportabile, del tipo che migliora anche il normale tempo di compilazione. Tuttavia, per il momento, anche la soluzione Lollipop non è l'ideale. Richiede agli sviluppatori di sviluppare solo contro Lollipop, il che potrebbe essere problematico poiché la maggior parte delle app vuole essere compatibile con fasce di pubblico più ampie e potrebbe temere l'utilizzo di funzionalità che non sono disponibili nelle versioni precedenti di Android. Quindi, in questo momento, la soluzione Lollipop è una buona soluzione futura per Android, ma potrebbe non avere molto impatto nel prossimo futuro. Quindi cosa si può fare nel frattempo? Siamo tutti d'accordo sul fatto che non dovresti rinunciare a funzionalità e capacità, solo per evitare di raggiungere il limite di 65K. Ma non c'è dubbio che la migliore pratica sarebbe comunque quella di ridurre il conteggio del metodo di applicazione. Quindi, come puoi ancora provare a ridurre il conteggio dei tuoi metodi senza perdere quella piccola scintilla che rende speciale la tua app?

Da leggere Diversificare la tua carriera con il freelance: vantaggi assicurati

Una breve panoramica: "Da dove vengono tutti questi metodi?"

Il limite di conteggio dei metodi si attesta all'incirca a 65.000 metodi (65.536 per l'esattezza). Sembra un numero enorme. Se sei uno sviluppatore Android alle prime armi potresti pensare "come diavolo possono così tante app raggiungere questo numero così rapidamente?" Probabilmente avresti ragione. Non è facile scrivere così tanti metodi da soli. Ma gli sviluppatori di app non scrivono l'intera app da soli. Gli sviluppatori di app utilizzano sempre più librerie di terze parti (SDK - Software Development Kit), che li aiutano a raggiungere determinati obiettivi e funzionalità che altrimenti dovrebbero sviluppare completamente da soli. Dagli annunci pubblicitari ai miglioramenti della GUI ai social network, alla segnalazione di arresti anomali e molti altri, gli SDK offrono un'ampia gamma di funzionalità e API che consentono di risparmiare tempo prezioso di sviluppo e aiutano a portare la tua app sul mercato più velocemente. Ma ogni SDK si aggiunge al conteggio dei tuoi metodi e alcuni SDK stanno anche facendo più di quello per cui ti aspettavi. Non è necessariamente una cosa negativa, ovviamente. Tuttavia, il colpo di grazia è arrivato dagli stessi Google. Il loro kit di Google Play Services è un grande SDK contenente oltre 28.000 metodi. Con il limite di 65K, quel numero non è esattamente basso. E molti sviluppatori di app vorrebbero utilizzare questo SDK poiché apre le porte al magico regno di Google, una capacità tanto desiderata che aggiunge molto valore alla propria app. In questo post, non solo spiegherò come utilizzare selettivamente i pacchetti di Google Play Services, ma ti fornirò anche informazioni dettagliate su quanti metodi ciascuno di questi pacchetti aggiunge alla tua app. Quindi tieni i tuoi posti, sarà un viaggio accidentato.

Il parco giochi di Google Play Services

Quindi, quanti metodi aggiunge effettivamente Google Play Services? Bene, come per ogni cosa nella vita, è molto più complicato di un semplice numero di fondo. Ma facciamo un passo alla volta. L'SDK di Google Play Services contiene in realtà 19 SDK diversi. Con Gradle, puoi scegliere selettivamente quali usare. Tutto quello che devi fare è aggiungere la seguente dipendenza al file build.gradle del modulo dell'app:

 dipendenze {
compila 'com.google.android.gms:play-services:7.5.0'
}

Con 7.5.0 è l'ultima versione GPS rilasciata in questo momento. È etichettato come revisione 25 all'interno di Android SDK Manager. Per scegliere pacchetti specifici, sostituisci la riga seguente con tutte le righe di dipendenza che desideri, specificando pacchetti specifici. Supponiamo, ad esempio, che tu voglia solo Google Plus, Google Games, Google Ads e Google Maps:

 dipendenze {
compila 'com.google.android.gms:play-services-plus:7.5.0'
compila 'com.google.android.gms:play-services-games:7.5.0'
compila "com.google.android.gms:play-services-ads:7.5.0"
compila 'com.google.android.gms:play-services-maps:7.5.0'
}

Non troppo difficile, ma ecco la prima cattura. Uno dei gloriosi 19 SDK è chiamato play-services-base. Se includi qualsiasi pacchetto di Google Play Service, verrà aggiunto automaticamente anche questo. Quanti metodi contiene il pacchetto base? Quasi 8.000 (numero esatto sotto).

Deve leggere L'era degli imprenditori freelance: persone che hanno il freelance a un nuovo livello

Ed ecco la seconda cattura. Non ho incluso solo 3 pacchetti nell'esempio sopra. Non ho nemmeno incluso solo 4, se conti anche il pacchetto base. In effetti, ho incluso 5 pacchetti. Come mai? Perché il pacchetto Google Games utilizza il pacchetto Google Drive, quindi anche quello è stato importato (in realtà, Google Ads include anche un pacchetto chiamato tag manager, ma sto contando solo i pacchetti "selezionabili").

Quindi ora stiamo iniziando a capire perché è un po' più difficile contare quanti metodi ogni pacchetto di Google Play Services aggiunge alla nostra app. Includere un pacchetto non significa necessariamente escludere gli altri.

Quindi ecco i dettagli: quali pacchetti puoi aggiungere, quanti metodi aggiungono e quali altri pacchetti portano per mandare in crash la festa. I dati si riferiscono all'ultima versione di Google Play Services (7.5.0 / revisione 25):

Suggerimenti per gli sviluppatori Android per ridurre la dimensione del file APK 2
Numero totale di metodi: 28175

Numero totale di metodi: 28.175. Alcuni di questi numeri, bisogna ammetterlo, sono davvero atroci. Se tutto ciò che volevi era il pacchetto panorama, non puoi ottenere solo nove metodi, devi ottenerne quasi 8.000. Non c'è da stupirsi se così tante app si stanno avvicinando o superando il limite di 65K.

Alcuni di questi numeri potrebbero sembrare un po' incoerenti se provi a sommarli. Questo perché, ancora una volta, la logica alla base di Google Play Services è un po' più complicata di quanto sembri. Ad esempio, Google Analytics include un unico metodo da Google Ads per ottenere l'ID pubblicità dell'account.

Tieni presente che quando calcoli quanto ogni pacchetto aggiunge alla tua app, assicurati di escludere i doppi (ad esempio, non contare il pacchetto base più di una volta).

Non puoi aggiungere tutto in modo selettivo

Ed ecco il colpo finale. Ci sono due piccoli pacchetti all'interno di Google Play Services che non possono essere aggiunti selettivamente. Il pacchetto di ricerca (che ti dà accesso all'API di Google Now) include solo 22 metodi. Se vuoi usarlo, non hai altra scelta che aggiungere tutti gli oltre 28.000 metodi, l'intero Google Play Services. Si spera che questo venga risolto nelle versioni successive.

(Un altro pacchetto "inaccessibile" è il pacchetto appstate che include 111 metodi, tuttavia ora è deprecato a favore di SavedGames , incluso nel pacchetto google-play-games).

Assumi Freelancer su Truelancer