Migrazione ad Android 8.0

Android 8.0 (livello API 26) introduce modifiche del comportamento, nonché nuove funzionalità e API che puoi sfruttare nelle tue app. Questo documento fornisce una panoramica dei passaggi per eseguire la migrazione delle app ad Android 8.0 in due fasi principali:

  1. Assicurare la compatibilità con Android 8.0

    Verifica che la tua app sia completamente funzionante nella nuova versione della piattaforma. In questa fase, non utilizzi nuove API o modifichi il valore targetSdkVersion dell'app, ma potrebbero essere necessarie modifiche di minore entità.

  2. Aggiornare la versione di destinazione e utilizzare le funzionalità di Android 8.0

    Quando è tutto pronto per sfruttare le nuove funzionalità della piattaforma, aggiorna targetSdkVersion a 26, verifica che l'app continui a funzionare come previsto e poi inizia a utilizzare nuove API.

Garantire la compatibilità con Android 8.0

L'obiettivo è assicurarti che la tua app esistente funzioni così com'è su Android 8.0 (livello API 26). Poiché alcune modifiche alla piattaforma potrebbero influire sul comportamento dell'app, potrebbero essere necessari alcuni aggiustamenti, ma non è necessario utilizzare nuove API o modificare targetSdkVersion.

Garantire la compatibilità con Android 8.0 passo passo

Preparare un dispositivo con Android 8.0

  • Se hai un dispositivo compatibile (Pixel, Pixel XL, Pixel C, Nexus 5X, Nexus 6P o Nexus Player), segui le istruzioni per eseguire il flashing del dispositivo.
  • In alternativa, scarica l'immagine di sistema Android 8.0 per l'emulatore di Android. È elencato in SDK Manager in Android 8.0 come API Intel x86 Atom System Image di Google.

    Nota: l'immagine di sistema Android 8.0 è disponibile per il download da Android Studio 3.0 e versioni successive. Per saperne di più, consulta la sezione riportata di seguito su come scaricare l'SDK Android 8.0.

Esegui test di compatibilità

In genere, testare la compatibilità con Android 8.0 (livello API 26) prevede lo stesso tipo di test che esegui quando ti prepari a rilasciare l'app. È il momento giusto per rivedere le norme sulla qualità delle app principali e le best practice per i test.

Tuttavia, c'è un altro aspetto dei test: Android 8.0 introduce modifiche alla piattaforma Android che possono influire sul comportamento della tua app o interromperla del tutto, anche se non modifichi il tuo targetSdkVersion. Per questo motivo, è importante esaminare le modifiche principali nella tabella 1 e testare le eventuali correzioni implementate per adeguarle.

Tabella 1. Modifiche principali che interessano tutte le app in esecuzione su dispositivi Android 8.0.

Cambia Riepilogo Ulteriori informazioni
Aggiornamenti della posizione in background meno frequenti Se la tua app riceve aggiornamenti della posizione da un servizio in background, su Android 8.0 (livello API 26) riceve aggiornamenti meno frequenti rispetto alle versioni precedenti di Android. Nello specifico, un servizio in background non può ricevere aggiornamenti della posizione più di alcune volte all'ora. Tuttavia, mentre l'app è in primo piano, la frequenza degli aggiornamenti della posizione rimane invariata. Limiti di posizioni in background
net.hostname non sono più supportati L'esecuzione di query sulla proprietà di sistema net.hostname produce un risultato nullo. Nessun valore
Nuova eccezione da send(DatagramPacket) Il metodo send(DatagramPacket) genera un SocketException se il metodo connect(InetAddress, int) eseguito in precedenza ha esito negativo. Modifiche del comportamento: connettività di rete e HTTP(S)
NullPointerException corretto da AbstractCollection metodi AbstractCollection.removeAll(null) e AbstractCollection.retainAll(null) ora generano sempre un NullPointerException; in precedenza, NullPointerException non veniva generato quando la raccolta era vuota. Questa modifica rende il comportamento coerente con la documentazione. Modifiche del comportamento: gestione della raccolta
NullPointerException corretto da Currency.getDisplayName(null) La chiamata a Currency.getDisplayName(null) genera un NullPointerException. Modifiche del comportamento: impostazioni internazionali e internazionalizzazione

Per un elenco più completo delle modifiche del comportamento in Android 8.0 (livello API 26), consulta anche la pagina relativa alle modifiche al comportamento di Android 8.0.

Aggiornare la versione di destinazione e utilizzare le funzionalità di Android 8.0

In questa sezione viene spiegato come attivare il supporto completo per Android 8.0 (livello API 26) aggiornando targetSdkVersion alla versione 26 e aggiungendo nuove funzionalità disponibili in Android 8.0.

Oltre a offrirti nuove API, Android 8.0 introduce alcuni cambiamenti del comportamento quando aggiorni il tuo targetSdkVersion alla versione 26. Poiché alcune modifiche del comportamento potrebbero richiedere modifiche al codice per evitare interruzioni, dovresti prima capire in che modo la tua app potrebbe essere interessata dalla modifica di targetSdkVersion esaminando tutte le modifiche del comportamento delle app che hanno come target Android 8.0.

Nota: i passaggi descritti sopra per garantire la compatibilità della piattaforma sono dei prerequisiti per scegliere Android 8.0 come target della tua app, quindi assicurati di completare prima questi passaggi.

Aggiorna la versione di destinazione e usa le funzionalità di Android 8.0 passo passo

Scarica l'SDK per Android 8.0

Puoi ricevere i pacchetti SDK per creare la tua app con Android 8.0 (livello API 26) utilizzando la versione più recente di Android Studio (è consigliabile utilizzare Android Studio 3.0 o versioni successive). Android Studio 3.0 e versioni successive include strumenti che aiutano l'utente con le funzionalità di Android 8.0, come le icone adattive e i caratteri scaricabili. Se non hai ancora bisogno di queste funzionalità, puoi usare la versione stabile di Android Studio 2.3.3 per creare la tua app con Android 8.0 e usare le nuove API.

Per configurare una versione di Android Studio, procedi nel seguente modo:

  1. Avvia Android Studio e apri SDK Manager facendo clic su Strumenti > SDK Manager.
  2. Nella scheda Piattaforme SDK, seleziona Mostra dettagli pacchetto. Sotto Anteprima Android 8.0, controlla quanto segue:
    • Piattaforma SDK Android 26
    • API di Google Intel x86 Atom System Image (richiesto solo per l'emulatore)
  3. Passa alla scheda Strumenti SDK e seleziona tutti gli elementi per cui sono disponibili aggiornamenti (fai clic su ogni casella di controllo che mostra un trattino ). Questa scheda dovrebbe includere le versioni più recenti dei seguenti elementi obbligatori:
    • Strumenti build SDK Android 26.0.0
    • SDK Platform-Strumenti per Android 26.0.0
    • Emulatore Android 26.0.0
  4. Fai clic su OK per installare tutti i pacchetti SDK selezionati.

Ora puoi iniziare a creare con Android 8.0.

Aggiorna la configurazione della build

Aggiorna compileSdkVersion, targetSdkVersion e la versione della libreria di supporto alle ultime revisioni disponibili, ad esempio:

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

Rimuovere i ricevitori di trasmissioni dal file manifest

Poiché Android 8.0 (livello API 26) introduce nuove limitazioni per i ricevitori di trasmissioni, devi rimuovere tutti i ricevitori di trasmissione registrati per intent di trasmissione impliciti. Lasciarle attive non interrompe la tua app in fase di build o runtime, ma non hanno alcun effetto quando l'app viene eseguita su Android 8.0.

I broadcast a cui solo la tua app può rispondere (gli intent di trasmissione e i broadcast espliciti inviati al nome del pacchetto dell'app) continuano a funzionare allo stesso modo su Android 8.0.

Esistono alcune eccezioni a questa nuova limitazione. Per un elenco delle trasmissioni implicite ancora funzionanti nelle app destinate ad Android 8.0, consulta la sezione Eccezioni di trasmissione implicite.

Testare l'app Android 8.0

Una volta completati i preparativi precedenti, puoi creare la tua app e testarla ulteriormente per assicurarti che funzioni correttamente quando scegli come target Android 8.0 (livello API 26). Questo è un altro buon momento per consultare le norme sulla qualità principali delle app e le best practice per i test.

Quando crei la tua app con il valore targetSdkVersion impostato su 26, devi tenere presenti alcune modifiche specifiche alla piattaforma. Alcune di queste modifiche possono influire notevolmente sul comportamento della tua app o addirittura interromperla del tutto, anche se non implementi nuove funzionalità in Android 8.0.

La tabella 2 fornisce un elenco di queste modifiche con link a ulteriori informazioni.

Tabella 2. Modifiche principali che interessano le app quando il valore di targetSdkVersion è impostato su 26.

Cambia Riepilogo Ulteriori informazioni
Privacy Android 8.0 (livello API 26) non supporta l'utilizzo delle proprietà di sistema net.dns1, net.dns2, net.dns3 o net.dns4. Modifiche del comportamento: privacy
Applicazione di segmenti scrivibili ed eseguibili Per le librerie native, Android 8.0 (livello API 26) applica la regola secondo cui i dati non devono essere eseguibili e il codice non deve essere scrivibile. Modifiche del comportamento: librerie native
Convalida di intestazioni e sezioni ELF Il linker dinamico controlla più valori nell'intestazione ELF e nelle intestazioni di sezione e ha esito negativo se non sono validi. Modifiche del comportamento: librerie native
Notifiche Le app che hanno come target la versione Android 8.0 (livello API 26) dell'SDK devono implementare uno o più canali di notifica per pubblicare notifiche per gli utenti. Panoramica dell'API: notifiche
Il metodo List.sort() Le implementazioni di questo metodo potrebbero non chiamare più Collections.sort() oppure la tua app genererà un'eccezione a causa dell'overflow dello stack. Modifiche del comportamento: gestione della raccolta
Il metodo Collections.sort() Nelle implementazioni Elenco, Collections.sort() ora genera ConcurrentModificationException. Modifiche al comportamento: gestione della raccolta

Per un elenco più completo delle modifiche del comportamento in Android 8.0 (livello API 26), consulta la pagina relativa alle modifiche al comportamento di Android 8.0.

Per esplorare le nuove funzionalità e API disponibili con Android 8.0 (livello API 26), consulta la pagina Funzionalità e API di Android 8.0.