Creare più APK per schermi di dimensioni diverse

Se pubblichi la tua app su Google Play, devi creare e caricare un Android App Bundle. In questo modo, Google Play genera e pubblica automaticamente APK ottimizzati per la configurazione del dispositivo di ogni utente, in modo che scarichi solo il codice e le risorse di cui ha bisogno per eseguire la tua app. La pubblicazione di più APK è utile se non pubblichi su Google Play, ma devi creare, firmare e gestire ogni APK autonomamente.

Quando sviluppi la tua applicazione Android per sfruttare più APK su Google Play, è importante adottare alcune best practice fin dall'inizio ed evitare problemi indesiderati più avanti nel processo di sviluppo. Questa lezione mostra come creare più APK della tua app, ciascuno che copra una classe diversa di dimensioni dello schermo. Inoltre, avrai a disposizione alcuni strumenti necessari per gestire la base di codice di più APK nel modo più semplice possibile.

Verifica di aver bisogno di più APK

Quando cerchi di creare un'applicazione che funzioni su più dimensioni di dispositivi Android, è naturale che tu voglia che l'applicazione utilizzi tutto lo spazio disponibile sui dispositivi più grandi, senza sacrificare la compatibilità o l'usabilità sugli schermi più piccoli. All'inizio potrebbe sembrare che il supporto di più APK sia la soluzione migliore, ma spesso non è così. La sezione Utilizzare un singolo APK della guida per gli sviluppatori relativa ai più APK include alcune informazioni utili su come eseguire questa operazione con un singolo APK, incluso l'utilizzo della nostra libreria di supporto. Ti consigliamo anche di leggere la guida al supporto di più schermi. Inoltre, esiste anche una libreria di supporto che puoi scaricare utilizzando l'SDK Android, che ti consente di utilizzare i frammenti sui dispositivi precedenti a Honeycomb (semplificando molto il supporto di più schermi in un singolo APK).

Se puoi, limitare l'applicazione a un singolo APK offre diversi vantaggi, tra cui:

  • La pubblicazione e i test sono più semplici
  • Devi gestire un'unica base di codice
  • L'applicazione può adattarsi alle modifiche alla configurazione del dispositivo
  • Il ripristino delle app su più dispositivi funziona e basta
  • Non devi preoccuparti delle preferenze di mercato, del comportamento degli "upgrade" da un APK all'altro o di quale APK sia associato a quale classe di dispositivi

Il resto di questa lezione presuppone che tu abbia studiato l'argomento, assorbito attentamente il materiale nelle risorse collegate e stabilito che più APK sono la strada giusta per la tua applicazione.

Elabora un grafico dei requisiti

Inizia creando un grafico semplice per determinare rapidamente quanti APK ti servono e le dimensioni dello schermo coperte da ciascun APK. Per fortuna, è facile tracciare i requisiti in modo rapido e semplice, e avere un riferimento per il futuro. Inizia con una riga di celle che rappresentano le varie dimensioni dello schermo disponibili sulla piattaforma Android.

piccole normale grande xlarge

Ora colora il grafico in modo che ogni colore rappresenti un APK. Ecco un esempio di come potresti applicare ogni APK a un determinato intervallo di dimensioni dello schermo.

piccole normale grande xlarge

A seconda delle tue esigenze, puoi anche avere due APK, "piccolo e tutti gli altri" o "grande e tutti gli altri". La colorazione del grafico semplifica anche la comunicazione all'interno del team: ora puoi fare riferimento a ogni APK semplicemente come "blu", "verde" o "rosso", indipendentemente dal numero di tipi di schermate che copre.

Inserire tutto il codice e le risorse comuni in un progetto di libreria

Che tu stia modificando un'applicazione Android esistente o ne stia creando una da zero, questa è la prima cosa che devi fare al codice di base e di gran lunga la più importante. Tutto ciò che viene inserito nel progetto della libreria deve essere aggiornato una sola volta (ad esempio stringhe localizzate in base alla lingua, temi di colore, bug corretti nel codice condiviso), il che migliora i tempi di sviluppo e riduce la probabilità di errori che potrebbero essere stati facilmente evitati.

Nota: anche se i dettagli di implementazione su come creare e includere progetti di librerie non rientrano nell'ambito di questa lezione, puoi acquisire le nozioni di base leggendo l'articolo Creare una libreria Android.

Se stai convertendo un'applicazione esistente per utilizzare il supporto di più APK, esamina la base di codice per trovare tutti i file di stringhe localizzate, gli elenchi di valori, i colori del tema, le icone del menu e il layout che non cambieranno negli APK e inseriscili tutti nel progetto della libreria. Anche il codice che non cambierà molto deve essere inserito nel progetto della libreria. È probabile che tu debba estendere queste classi per aggiungere uno o due metodi da un APK all'altro.

Se invece crei l'applicazione da zero, cerca di scrivere il codice nel progetto della libreria prima, poi spostalo in un singolo APK solo se necessario. È molto più facile da gestire nel lungo periodo rispetto all'aggiungerlo a uno, poi a un altro, poi a un altro e, mesi dopo, cercare di capire se questo blob può essere spostato nella sezione della libreria senza rovinare nulla.

Creare nuovi progetti APK

Deve essere presente un progetto Android separato per ogni APK che vuoi rilasciare. Per una facile organizzazione, posiziona il progetto della libreria e tutti i progetti APK correlati nella stessa cartella principale. Inoltre, ricorda che ogni APK deve avere lo stesso nome del pacchetto, anche se non necessariamente deve condividerlo con la libreria. Se avessi 3 APK che seguono lo schema descritto in precedenza, la tua directory principale potrebbe avere il seguente aspetto:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Una volta creati i progetti, aggiungi il progetto della libreria come riferimento a ogni progetto APK. Se possibile, definisci l'attività iniziale nel progetto della libreria ed estendila nel progetto APK. Avere un'attività iniziale definita nel progetto della libreria ti offre la possibilità di riunire tutta l'inizializzazione dell'applicazione in un unico posto, in modo che ogni singolo APK non debba implementare nuovamente attività "universali" come l'inizializzazione di Analytics, l'esecuzione di controlli delle licenze e qualsiasi altra procedura di inizializzazione che non cambia molto da un APK all'altro.

Modificare i manifest

Quando un utente scarica un'applicazione che utilizza più APK tramite Google Play, l'APK corretto da utilizzare viene scelto utilizzando due semplici regole:

  • Il file manifest deve indicare che il determinato APK è idoneo
  • Tra gli APK idonei, vince il numero di versione più alto

A titolo esemplificativo, prendiamo l'insieme di più APK descritto in precedenza e supponiamo che ogni APK sia stato impostato per supportare tutte le dimensioni dello schermo più grandi di quelle "target". Presi singolarmente, l'intervallo possibile di ogni APK sarebbe il seguente:

piccole normale grande xlarge
piccole normale grande xlarge
piccole normale grande xlarge

Tuttavia, utilizzando la regola "il numero di versione più alto vince", se impostiamo l'attributo versionCode in ogni APK in modo che il rosso sia maggiore o uguale al verde e questo sia maggiore o uguale al blu, il grafico si riduce a quanto segue:

piccole normale grande xlarge

Supponiamo inoltre che l'APK rosso abbia alcuni requisiti che non sono presenti negli altri due. La pagina Filtri su Google Play della Guida per gli sviluppatori Android contiene un elenco completo dei possibili responsabili. A titolo esemplificativo, supponiamo che il colore rosso richieda una fotocamera anteriore. In effetti, l'intero scopo dell'APK rosso è utilizzare lo spazio sullo schermo aggiuntivo disponibile per fare cose divertenti con la fotocamera anteriore. Tuttavia, sembra che non tutti i dispositivi di grandi dimensioni abbiano una fotocamera anteriore. Orrore!

Fortunatamente, se un utente sta navigando su Google Play da uno di questi dispositivi, Google Play esaminerà il manifest, vedrà che Red elenca la fotocamera anteriore come requisito e lo ignorerà silenziosamente, avendo stabilito che Red e il dispositivo non sono una coppia perfetta nel paradiso digitale. Vedrà quindi che Verde non è solo compatibile con i dispositivi di grandi dimensioni, ma non è importante nemmeno se c'è o meno una fotocamera anteriore. L'app può comunque essere scaricata dall'utente da Google Play, perché nonostante l'incidente con la fotocamera anteriore, esisteva ancora un APK che supportava quella determinata dimensione dello schermo.

Per mantenere tutti gli APK in "canali" separati, è importante avere un buon schema di codici di versione. Quello consigliato si trova nell'area Codici versione della nostra guida per gli sviluppatori. Poiché l'insieme di APK di esempio riguarda solo una delle tre possibili dimensioni, sarebbe sufficiente separare ogni APK per 1000 e incrementare da lì. Potrebbe avere il seguente aspetto:

Blu: 1001, 1002, 1003, 1004...
Verde: 2001, 2002, 2003, 2004…
Red:3001, 3002, 3003, 3004...

Mettendo tutto insieme, i manifest di Android dovrebbero avere il seguente aspetto:

Blu:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Verde:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Rosso:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Tieni presente che, tecnicamente, più APK funzioneranno con il tag supporta-schermi o con il tag schermi-compatibili. In genere è preferibile utilizzare Supports-screens e in genere è una pessima idea utilizzare entrambi i tag nello stesso manifest. Inoltre, complicano inutilmente le cose e aumentano le possibilità di errori. Tieni inoltre presente che, anziché sfruttare i valori predefiniti (small e normal sono sempre true per impostazione predefinita), i manifest impostano esplicitamente il valore per ogni dimensione dello schermo. In questo modo potrai evitare problemi in futuro. Ad esempio, per un manifest con un SDK di destinazione inferiore a 9, il valore xlarge verrà impostato automaticamente su false, poiché questa dimensione non esisteva ancora. Quindi sii esplicito.

Controlla l'elenco di controllo pre-lancio

Prima di eseguire il caricamento su Google Play, controlla i seguenti elementi. Ricorda che si tratta di elementi specificamente pertinenti a più APK e non rappresentano in alcun modo un elenco di controllo completo per tutte le applicazioni caricate su Google Play.

  • Tutti gli APK devono avere lo stesso nome del pacchetto
  • Tutti gli APK devono essere firmati con lo stesso certificato
  • Tutte le dimensioni dello schermo che vuoi che l'APK supporti, impostate su true nel manifest. Ogni dimensione dello schermo che vuoi evitare, impostata su false
  • Controlla attentamente che i filtri manifest non contengano informazioni in conflitto (un APK che supporta solo Cupcake su schermi XLARGE non verrà visto da nessuno)
  • Il file manifest di ogni APK deve essere univoco per almeno una delle seguenti proprietà supportate: schermo, texture OpenGL o versione della piattaforma
  • Prova a testare ogni APK su almeno un dispositivo. In caso contrario, sulla tua macchina di sviluppo hai uno degli emulatori di dispositivi più personalizzabili in circolazione. Divertiti!

Vale anche la pena ispezionare l'APK compilato prima di lanciarlo sul mercato, per assicurarti che non ci siano sorprese che potrebbero nascondere la tua applicazione su Google Play. È abbastanza semplice utilizzando lo strumento "aapt". Aapt (Android Asset Packaging Tool) fa parte del processo di compilazione per la creazione e il packaging delle applicazioni Android ed è anche uno strumento molto utile per ispezzionarle.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Quando esamini l'output di aapt, assicurati di non avere valori in conflitto per support-screens e compatible-screens e di non avere valori "uses-feature" indesiderati aggiunti a seguito delle autorizzazioni impostate nel file manifest. Nell'esempio precedente, l'APK sarà invisibile alla maggior parte, se non a tutti i dispositivi.

Perché? Aggiungendo l'autorizzazione richiesta SEND_SMS, è stato aggiunto implicitamente il requisito della funzionalità android.hardware.telephony. Poiché la maggior parte (se non tutti) dei dispositivi di grandi dimensioni sono tablet senza hardware di telefonia, Google Play escluderà questo APK in questi casi, fino a quando non verranno lanciati dispositivi futuri che siano sufficientemente grandi da essere segnalati come di grandi dimensioni e che dispongano di hardware di telefonia.

Per fortuna, il problema si risolve facilmente aggiungendo quanto segue al file manifest:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

Viene aggiunto anche il requisito android.hardware.touchscreen in modo implicito. Se vuoi che il tuo APK sia visibile sulle TV che non sono dispositivi touchscreen, devi aggiungere quanto segue al file manifest:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Dopo aver completato l'elenco di controllo pre-lancio, carica gli APK su Google Play. Potrebbe essere necessario un po' di tempo prima che l'applicazione venga visualizzata durante la navigazione su Google Play, ma quando ciò accade, esegui un ultimo controllo. Scarica l'applicazione su eventuali dispositivi di test per assicurarti che gli APK abbiano come target i dispositivi previsti.

Per ulteriori informazioni sulla pubblicazione di più APK su Google Play, consulta Supporto di più APK.