Migrazione ad Android 8.0

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

  1. Assicurare la compatibilità con Android 8.0

    Verifica che la tua app sia completamente funzionale sulla nuova versione della piattaforma. In questa fase non utilizzi nuove API né modifichi 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 usufruire delle nuove funzionalità della piattaforma, aggiorna targetSdkVersion alla versione 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 della tua app, potrebbe essere necessario apportare alcuni aggiustamenti, ma non è necessario utilizzare nuove API o modificare il tuo targetSdkVersion.

Garantisci 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 Android. È elencato in Gestione SDK in Android 8.0 come Immagine di sistema Intel x86 Atom per le API 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 di seguito per ottenere l'SDK Android 8.0.

Esegui test di compatibilità

Per la maggior parte, testare la compatibilità con Android 8.0 (livello API 26) richiede lo stesso tipo di test che esegui quando ti prepari a rilasciare l'app. È un buon momento per rivedere le linee guida sulla qualità principale delle app e le best practice per i test.

Tuttavia, c'è un altro aspetto nel test: Android 8.0 introduce modifiche alla piattaforma Android che possono influenzare il comportamento della tua app o interromperla del tutto, anche se non modifichi targetSdkVersion. Per questo motivo, è importante esaminare le modifiche principali riportate nella tabella 1 e testare le correzioni che implementi per adattarle alle modifiche.

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

Cambia Riepilogo Ulteriori riferimenti
Aggiornamenti della posizione in background meno frequenti Se la tua app riceve aggiornamenti sulla 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 sulla posizione più di qualche volta all'ora. Tuttavia, mentre la tua app è in primo piano, la frequenza degli aggiornamenti della posizione rimane invariata. Limiti di località in background
net.hostname non sono più supportati L'esecuzione di una query sulla proprietà di sistema net.hostname produce un risultato nullo. Nessuno
Nuova eccezione da send(DatagramPacket) Il metodo send(DatagramPacket) genera un SocketException se il metodo connect(InetAddress, int) eseguito in precedenza non ha avuto esito positivo. Modifiche del comportamento: connettività di rete e HTTP(S)
Metodi NullPointerException da AbstractCollection appropriati 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 al comportamento: impostazioni internazionali e localizzazione

Per un elenco più completo delle modifiche al comportamento in Android 8.0 (livello API 26), consulta anche Modifiche al comportamento di 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 targetSdkVersion alla versione 26 e aggiungendo nuove funzionalità disponibili in Android 8.0.

Oltre a offrire nuove API, Android 8.0 introduce alcune modifiche al comportamento quando aggiorni targetSdkVersion alla versione 26. Poiché alcune modifiche del comportamento potrebbero richiedere modifiche al codice per evitare interruzioni, devi prima capire in che modo la tua app potrebbe essere interessata quando modifichi il targetSdkVersion esaminando tutte le modifiche del comportamento per le app che hanno come target Android 8.0.

Nota: i passaggi descritti sopra per garantire la compatibilità delle piattaforme sono un prerequisito per poter scegliere come target della tua app Android 8.0, quindi assicurati di completare prima questi passaggi.

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

Scaricare l'SDK Android 8.0

Puoi ottenere i pacchetti SDK per creare la tua app con Android 8.0 (livello API 26) utilizzando la versione più recente di Android Studio (è consigliata la versione 3.0 o successive di Android Studio). Android Studio 3.0 e versioni successive include strumenti utili per le funzionalità di Android 8.0, come le icone ad attivazione dinamica e i caratteri scaricabili. Se non hai ancora bisogno di queste funzionalità, puoi utilizzare la versione stabile di Android Studio 2.3.3 per creare la tua app con Android 8.0 e utilizzare le nuove API.

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

  1. Avvia Android Studio e apri SDK Manager facendo clic su Strumenti > SDK Manager.
  2. Nella scheda SDK Platforms (Piattaforme SDK), seleziona Mostra dettagli pacchetto. Nella sezione dell'anteprima di Android 8.0 controlla quanto segue:
    • Piattaforma SDK Android 26
    • Immagine di sistema Atom Intel x86 per le API Google (obbligatoria solo per l'emulatore)
  3. Passa alla scheda Strumenti SDK e controlla tutti gli elementi per i quali sono disponibili aggiornamenti (fai clic su ogni casella di controllo che mostra un trattino ). Dovrebbero essere incluse le versioni più recenti dei seguenti elementi obbligatori:
    • Android SDK Build-Tools 26.0.0
    • SDK Platform-Strumenti per Android 26.0.0
    • Android Emulator 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 di compilazione

Aggiorna compileSdkVersion, targetSdkVersion e la versione della Libreria di supporto alle revisioni più recenti 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 receiver di trasmissione dal file manifest

Poiché Android 8.0 (livello API 26) introduce nuove limitazioni per i broadcast receiver, devi rimuovere tutti i broadcast receiver registrati per gli intent di trasmissione impliciti. Se li lasci invariati, l'app non viene interrotta in fase di compilazione o di esecuzione, ma non hanno alcun effetto quando l'app viene eseguita su Android 8.0.

Le trasmissioni a cui solo la tua app può rispondere (gli intent di trasmissione espliciti e le trasmissioni inviate al nome del pacchetto della tua app in modo specifico) continuano a funzionare allo stesso modo su Android 8.0.

Esistono eccezioni a questa nuova limitazione. Per un elenco di trasmissioni implicite ancora disponibili nelle app che hanno come target Android 8.0, vedi Eccezioni per le trasmissioni implicite.

Testa la tua app per Android 8.0

Una volta completate le preparazioni precedenti, puoi creare l'app e poi testarla ulteriormente per assicurarti che funzioni correttamente quando scegli come target Android 8.0 (livello API 26). È un'altra buona occasione per consultare le norme sulla qualità delle app di base e le best practice per i test.

Quando crei l'app con targetSdkVersion impostato su 26, devi tenere conto di modifiche specifiche della 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 targetSdkVersion è impostato su 26.

Cambia Riepilogo Ulteriori riferimenti
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 al comportamento: Privacy
Segmenti scrivibili ed eseguibili applicati 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 dell'intestazione e della sezione ELF Il linker dinamico controlla più valori nell'intestazione ELF e nelle intestazioni delle sezioni e ha esito negativo se non sono validi. Modifiche al comportamento: Librerie native
Notifiche Le app che hanno come target la versione dell'SDK per Android 8.0 (livello API 26) devono implementare uno o più canali di notifica per inviare notifiche agli utenti. Panoramica dell'API: Notifiche
Il metodo List.sort() Le implementazioni di questo metodo potrebbero non chiamare più Collections.sort() oppure la tua app potrebbe generare un'eccezione a causa di un overflow dello stack. Modifiche al comportamento: Gestione delle raccolte
Il metodo Collections.sort() Nelle implementazioni di List, Collections.sort() ora genera un ConcurrentModificationException. Modifiche al comportamento: gestione delle raccolte

Per un elenco più completo delle modifiche al comportamento in Android 8.0 (livello API 26), consulta Modifiche al comportamento di Android 8.0.

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