Capire il packaging di APK in Android Studio 2.2
30 dicembre 2016
Recentemente abbiamo lanciato Android Studio 2.2 con molte caratteristiche nuove e perfezionati. È facile non notare alcuni dei cambiamenti poiché sono stati apportati nell'ambito del plugin Android Gradle, come nel caso dell'operazione di packaging e firma dell'APK integrato e riscritto recentemente.Read More
Recentemente abbiamo lanciato Android Studio 2.2 con molte caratteristiche nuove e perfezionati. È facile non notare alcuni dei cambiamenti poiché sono stati apportati nell'ambito del plugin Android Gradle, come nel caso dell'operazione di packaging e firma dell'APK integrato e riscritto recentemente.
Dopo aver introdotto il nuovo APK Signature Scheme v2 in Android 7.0 Nougat, abbiamo deciso di riscrivere come funziona l'assemblaggio dei file APK nel plugin Android Gradle. Puoi leggere tutti i dettagli tecnici più specifici relativi alle firme v2 nella documentazione, ma qui ti proponiamo una breve sintesi tl;dr delle informazioni che ti serveranno per sviluppare app Android.
Perché abbiamo introdotto questo cambiamento nel modo in cui Android verifica i file APK? Innanzitutto, per una maggiore sicurezza ed estensibilità di questo nuovo formato di firma, e poi per le prestazioni. Infatti grazie alle nuove firme, la verifica sul dispositivo richiede molto meno tempo (e niente costose decompressioni) e di conseguenza si velocizza l’installazione delle app.
Il risultato di questo nuovo schema di firma, tuttavia, è che si sono creati nuovi vincoli nel processo di creazione di APK. Dato che solo i contenuti dei file non compressi venivano verificati in v1, ciò permetteva di apportare parecchie modifiche dopo la firma APK, infatti i file potevano essere spostati o anche ricompressi. Lo strumento
Poiché le firme v2 verificano tutti i byte in archivio e non le singole voci ZIP, eseguire
In caso di attività personalizzate nel processo di compilazione che comportino la manomissione o post-elaborazione del file APK in alcun modo, assicurati di disattivarle altrimenti rischi di rendere la firma v2 non valida e il tuo APK incompatibile con Android 7.0 e le versioni successive.
Se decidi di eseguire la firma e l'allineamento manualmente (ad esempio dalla riga di comando), ti offriamo un nuovo strumento nell'SDK di Android, chiamato
Qualora desiderassi disabilitare l'aggiunta delle firme v1 o v2 durante la compilazione con il plugin Gradle Android, potresti aggiungere queste righe alla tua sezione
Nota: entrambi gli schemi di firma sono abilitati per impostazione predefinita nel plugin Android Gradle 2.2.
Durante la riscrittura del packager, abbiamo colto l'occasione per ottimizzare le dimensioni degli APK di release, con conseguenti download più veloci, aggiornamenti delta più piccoli sul Play Store e meno spazio sprecato sul dispositivo. Ecco alcuni dei cambiamenti che abbiamo apportato:
Questi cambiamenti contribuiscono a rendere la release più piccola possibile in modo che gli utenti possano scaricare e aggiornare l'app anche tramite una connessione lenta o su dispositivi meno potenti. Ma cosa succede con le build di debug?
Durante lo sviluppo delle app dovresti cercare di mantenere un ciclo di iterazione veloce, ossia cambiare il codice, compilare e distribuire su un dispositivo o un emulatore collegato. A partire da Android Studio 2.0 ci siamo impegnati per rendere queste fasi quanto più rapide possibile. Con Instant Run, ora siamo in grado di aggiornare solo il codice e le risorse modificati durante il runtime, mentre il nuovo emulatore offre un supporto multi-processore e una maggiore velocità ADB per installazioni e trasferimenti dell'APK più rapidi. I miglioramenti alle build possono ridurre ulteriormente il tempo impiegato e abbiamo introdotto il packaging incrementale e la compressione parallela per le build di debug in Android Studio 2.2. Insieme ad altre caratteristiche come le risorse di packaging selettivo per la densità del dispositivo di destinazione e di ABI, tutto questo velocizzerà ulteriormente la tua capacità di programmare.
Un avvertimento però: i file APK creati per Instant Run o richiamando una build di debug non sono destinati alla distribuzione nel Play Store! Contengono codice di strumentazione aggiuntivo per Instant Run e non hanno tutte le risorse necessarie per la configurazione di dispositivi diversi da quello collegato quando hai iniziato la build. Assicurati di distribuire solo le versioni di release dell'APK che si possono creare utilizzando il comando Generate Signed APK di Android Studio o con l'attività assembleRelease Gradle.
APK Signature Scheme v2
Dopo aver introdotto il nuovo APK Signature Scheme v2 in Android 7.0 Nougat, abbiamo deciso di riscrivere come funziona l'assemblaggio dei file APK nel plugin Android Gradle. Puoi leggere tutti i dettagli tecnici più specifici relativi alle firme v2 nella documentazione, ma qui ti proponiamo una breve sintesi tl;dr delle informazioni che ti serveranno per sviluppare app Android.
- La firma crittografica dell'APK, che viene utilizzata per verificarne l'integrità, si trova ora immediatamente prima della ZIP Central Directory.
- La firma viene calcolata e verificata in base al contenuto binario dell'intero file APK, a differenza del contenuto dei file decompressi di ogni file nell'archivio in v1.
- Un APK può essere firmato da entrambe le firme v1 e v2 contemporaneamente, così rimane retrocompatibile con le precedenti release di Android.
Perché abbiamo introdotto questo cambiamento nel modo in cui Android verifica i file APK? Innanzitutto, per una maggiore sicurezza ed estensibilità di questo nuovo formato di firma, e poi per le prestazioni. Infatti grazie alle nuove firme, la verifica sul dispositivo richiede molto meno tempo (e niente costose decompressioni) e di conseguenza si velocizza l’installazione delle app.
Il risultato di questo nuovo schema di firma, tuttavia, è che si sono creati nuovi vincoli nel processo di creazione di APK. Dato che solo i contenuti dei file non compressi venivano verificati in v1, ciò permetteva di apportare parecchie modifiche dopo la firma APK, infatti i file potevano essere spostati o anche ricompressi. Lo strumento
zipalign
, che rientrava nel processo di compilazione, faceva esattamente questo: veniva utilizzato per allineare le voci ZIP sui corretti limiti di byte per migliorare le prestazioni di runtime. Poiché le firme v2 verificano tutti i byte in archivio e non le singole voci ZIP, eseguire
zipalign
dopo la firma non è più possibile. Ecco perché la compressione, l'allineamento e la firma ora avvengono in un unico passaggio integrato durante il processo di compilazione. In caso di attività personalizzate nel processo di compilazione che comportino la manomissione o post-elaborazione del file APK in alcun modo, assicurati di disattivarle altrimenti rischi di rendere la firma v2 non valida e il tuo APK incompatibile con Android 7.0 e le versioni successive.
Se decidi di eseguire la firma e l'allineamento manualmente (ad esempio dalla riga di comando), ti offriamo un nuovo strumento nell'SDK di Android, chiamato
apksigner
, che fornisce sia le verifiche sia le firme v1 e v2 dell'APK. Ricorda che devi eseguire zipalign
prima di eseguire apksigner
se usi le firme v2. Ricorda inoltre che lo strumento jarsigner
di JDK non è compatibile con le firme v2 di Android, quindi non è possibile utilizzarlo per ri-firmare i tuoi APK se desideri conservare la firma v2. Qualora desiderassi disabilitare l'aggiunta delle firme v1 o v2 durante la compilazione con il plugin Gradle Android, potresti aggiungere queste righe alla tua sezione
signingConfig
in build.gradle: v1SigningEnabled false v2SigningEnabled false
Nota: entrambi gli schemi di firma sono abilitati per impostazione predefinita nel plugin Android Gradle 2.2.
Build di release per APK più piccoli
Durante la riscrittura del packager, abbiamo colto l'occasione per ottimizzare le dimensioni degli APK di release, con conseguenti download più veloci, aggiornamenti delta più piccoli sul Play Store e meno spazio sprecato sul dispositivo. Ecco alcuni dei cambiamenti che abbiamo apportato:
- I file presenti nell'archivio da ora vengono ordinati per minimizzare le differenze tra le build APK.
- Tutti i timestamp dei file e metadati vengono azzerati.
- La compressione dei Livelli 6 e 9 è controllata in parallelo per tutti i file e consente di usare quella ottimale, ossia se L9 offre scarsi benefici in termini di dimensioni, si può scegliere L6 per ottenere prestazioni migliori.
- Le librerie native sono archiviate in forma non compressa e la pagina viene allineata nell'APK. Tutto ciò supporta l'opzione
android:extractNativeLibs="false"
di Android 6.0 Marshmallow e consente alle app di utilizzare meno spazio sul dispositivo oltre che generare aggiornamenti più piccoli per il Play Store. - La compressione Zopfli non viene utilizzata per supportare gli algoritmi di aggiornamento del Play Store. E non ti consigliamo di ricomprimere i tuoi APK con Zopfli. La pre-ottimizzazione delle risorse individuali, come nel caso dei file PNG nei progetti, è ancora valida e infatti viene consigliata.
Questi cambiamenti contribuiscono a rendere la release più piccola possibile in modo che gli utenti possano scaricare e aggiornare l'app anche tramite una connessione lenta o su dispositivi meno potenti. Ma cosa succede con le build di debug?
Build di debug per installazioni veloci
Durante lo sviluppo delle app dovresti cercare di mantenere un ciclo di iterazione veloce, ossia cambiare il codice, compilare e distribuire su un dispositivo o un emulatore collegato. A partire da Android Studio 2.0 ci siamo impegnati per rendere queste fasi quanto più rapide possibile. Con Instant Run, ora siamo in grado di aggiornare solo il codice e le risorse modificati durante il runtime, mentre il nuovo emulatore offre un supporto multi-processore e una maggiore velocità ADB per installazioni e trasferimenti dell'APK più rapidi. I miglioramenti alle build possono ridurre ulteriormente il tempo impiegato e abbiamo introdotto il packaging incrementale e la compressione parallela per le build di debug in Android Studio 2.2. Insieme ad altre caratteristiche come le risorse di packaging selettivo per la densità del dispositivo di destinazione e di ABI, tutto questo velocizzerà ulteriormente la tua capacità di programmare.
Un avvertimento però: i file APK creati per Instant Run o richiamando una build di debug non sono destinati alla distribuzione nel Play Store! Contengono codice di strumentazione aggiuntivo per Instant Run e non hanno tutte le risorse necessarie per la configurazione di dispositivi diversi da quello collegato quando hai iniziato la build. Assicurati di distribuire solo le versioni di release dell'APK che si possono creare utilizzando il comando Generate Signed APK di Android Studio o con l'attività assembleRelease Gradle.