Eseguire la 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 offre una panoramica dei passaggi per eseguire la migrazione delle tue app ad Android 8.0 in due fasi principali:

  1. Assicurare la compatibilità con Android 8.0

    Verifica che la tua app sia completamente funzionale 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 inizia a utilizzare le 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.

Istruzioni dettagliate per garantire la compatibilità con Android 8.0

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. È elencata in SDK Manager in Android 8.0 come Immagine di sistema Intel x86 Atom delle API di Google.

    Nota: l'immagine di sistema Android 8.0 è disponibile per il download da Android Studio 3.0 e versioni successive. Per ulteriori informazioni, consulta la sezione seguente su come scaricare l'SDK Android 8.0.

Esegui test di compatibilità

Testare la compatibilità con Android 8.0 (livello API 26) in gran parte comporta 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 danneggiarla 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, riceve aggiornamenti meno frequenti su Android 8.0 (livello API 26) rispetto alle versioni precedenti di Android. In particolare, un servizio in background non può ricevere aggiornamenti della posizione più di alcune volte all'ora. Tuttavia, mentre la tua 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 SocketException se il metodo connect(InetAddress, int) eseguito in precedenza non è riuscito. 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 di 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 Modifiche del comportamento Android 8.0.

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

Questa sezione spiega come attivare il supporto completo per Android 8.0 (livello API 26) aggiornando il tuo 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 al comportamento potrebbero richiedere modifiche al codice per evitare interruzioni, dovresti innanzitutto capire in che modo la tua app potrebbe essere interessata dalla modifica di targetSdkVersion esaminando tutte le modifiche del comportamento per le app destinate ad Android 8.0.

Nota: i passaggi descritti sopra per garantire la compatibilità della piattaforma sono prerequisiti per scegliere come target della tua app Android 8.0, 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 (è consigliato Android Studio 3.0 o versioni successive). Android Studio 3.0 e versioni successive include strumenti utili per 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 effettuare la configurazione con una delle versioni di Android Studio, procedi nel seguente modo:

  1. Avvia Android Studio e apri SDK Manager facendo clic su Strumenti > Gestore SDK.
  2. Nella scheda Piattaforme SDK, seleziona Mostra dettagli pacchetto. Sotto Anteprima di Android 8.0, controlla quanto segue:
    • Piattaforma SDK Android 26
    • Immagine di sistema Atom Intel x86 API di Google API (richiesta 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 ). Ciò dovrebbe includere le versioni più recenti dei seguenti elementi obbligatori:
    • Strumenti build SDK Android 26.0.0
    • Piattaforma-Strumenti SDK per Android 26.0.0
    • Emulatore Android 26.0.0
  4. Fai clic su OK per installare tutti i pacchetti SDK selezionati.

Ora è tutto pronto per iniziare a creare con Android 8.0.

Aggiorna la configurazione della build

Aggiorna compileSdkVersion, targetSdkVersion e la versione della Support Library 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'
    // }
}

Rimuovi ricevitori di trasmissioni dal file manifest

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

Le trasmissioni a cui solo la tua app può rispondere (intervenzioni e trasmissioni esplicite inviate specificamente al nome del pacchetto dell'app) continuano a funzionare allo stesso modo su Android 8.0.

Esistono eccezioni a questa nuova limitazione. Per un elenco delle trasmissioni implicite ancora funzionanti nelle app destinate ad Android 8.0, consulta la sezione Eccezioni alle trasmissioni 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 principali sulla qualità delle app e le best practice per i test.

Quando crei la tua app con targetSdkVersion impostato su 26, ci sono modifiche specifiche alla piattaforma di cui dovresti essere a conoscenza. Alcune di queste modifiche possono influire notevolmente sul comportamento della tua app o addirittura interrompere del tutto l'app, 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 se 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. Cambiamenti 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 restituisce 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 delle 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 al comportamento: gestione della raccolta
Il metodo Collections.sort() Nelle implementazioni dell'elenco, Collections.sort() ora genera ConcurrentModificationException. Modifiche al comportamento: gestione delle raccolte

Per un elenco più completo delle modifiche del comportamento in Android 8.0 (livello API 26), consulta la pagina Modifiche del comportamento su 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.