Modifiche del comportamento: app che hanno come target il livello API 28+

Android 9 (livello API 28) introduce una serie di modifiche al sistema Android, Le seguenti modifiche al comportamento si applicano esclusivamente alle app che hanno come target il livello API 28 o un livello superiore. Le app che impostano targetSdkVersion sul livello API 28 o su un livello superiore devono modificare le proprie app per supportare correttamente questi comportamenti, ove applicabile all'app.

Per le modifiche che interessano tutte le app in esecuzione su Android 9, indipendentemente dal livello API target, consulta la sezione Modifiche del comportamento: tutte le app.

Servizi in primo piano

Le app destinate ad Android 9 o versioni successive che utilizzano i servizi in primo piano devono richiedere l'autorizzazione FOREGROUND_SERVICE. Si tratta di un'autorizzazione normale, quindi il sistema la concede automaticamente all'app richiedente.

Se un'app destinata ad Android 9 o versioni successive tenta di creare un servizio in primo piano senza richiedere FOREGROUND_SERVICE, il sistema genera un elemento SecurityException.

Modifiche relative alla privacy

Se la tua app ha come target Android 9, devi tenere presente i seguenti cambiamenti di comportamento. Questi aggiornamenti alle informazioni DNS e seriali del dispositivo migliorano la privacy dell'utente.

Ritiro del numero di serie di build

In Android 9, l'elemento Build.SERIAL è sempre impostato su "UNKNOWN" per proteggere la privacy degli utenti.

Se la tua app deve accedere al numero di serie hardware di un dispositivo, devi richiedere l'autorizzazione READ_PHONE_STATE e poi chiamare getSerial().

Privacy DNS

Le app che hanno come target Android 9 devono rispettare le API DNS private. In particolare, le app devono garantire che, se il resolver di sistema utilizza DNS over TLS, qualsiasi client DNS integrato utilizzi il DNS criptato con lo stesso nome host del sistema o sia disabilitato a favore del resolver di sistema.

Modifiche alla sicurezza del framework

Android 9 include diverse modifiche del comportamento che migliorano la sicurezza della tua app, ma queste modifiche hanno effetto solo se la tua app ha come target il livello API 28 o versioni successive.

TLS di rete abilitato per impostazione predefinita

Se la tua app ha come target Android 9 o versioni successive, il metodo isCleartextTrafficPermitted() restituisce false per impostazione predefinita. Se la tua app deve abilitare il testo in chiaro per domini specifici, devi impostare esplicitamente cleartextTrafficPermitted su true per quei domini nella Configurazione della sicurezza di rete dell'app.

Directory dei dati basate sul web separate per processo

Per migliorare la stabilità e l'integrità dei dati in Android 9, le app non possono condividere una singola directory di dati di WebView tra più processi. In genere, queste directory di dati memorizzano cookie, cache HTTP e altro spazio di archiviazione permanente e temporaneo relativo alla navigazione sul web.

Nella maggior parte dei casi, l'app deve utilizzare le classi del pacchetto android.webkit, come WebView e CookieManager, in un solo processo. Ad esempio, devi spostare tutti gli oggetti Activity che utilizzano WebView nello stesso processo. Puoi applicare in modo più rigoroso la regola "solo per un processo" chiamando disableWebView() negli altri processi dell'app. Questa chiamata impedisce che WebView venga inizializzato in questi altri processi per errore, anche se viene chiamato da una libreria dipendente.

Se la tua app deve utilizzare istanze di WebView in più processi, devi assegnare un suffisso di directory dei dati univoco a ogni processo, utilizzando il metodo WebView.setDataDirectorySuffix(), prima di utilizzare una determinata istanza di WebView nel processo. Questo metodo posiziona i dati web di ogni processo nella propria directory all'interno della directory dei dati dell'app.

Domini SELinux per app

Le app destinate ad Android 9 o versioni successive non possono condividere dati con altre app utilizzando autorizzazioni Unix accessibili in tutto il mondo. Questa modifica migliora l'integrità di Android Application Sandbox, in particolare il requisito secondo cui i dati privati di un'app sono accessibili solo da quest'ultima.

Per condividere file con altre app, utilizza un fornitore di contenuti.

Modifiche alla connettività

Conteggio dei dati relativi alla connettività e multicammino

All'interno delle app destinate ad Android 9 o versioni successive, il sistema conteggia il traffico di rete su reti che non sono l'attuale impostazione predefinita, ad esempio il traffico cellulare quando il dispositivo è connesso al Wi-Fi, e fornisce metodi nella classe NetworkStatsManager per eseguire query per questo traffico.

In particolare, getMultipathPreference() ora restituisce un valore basato sul traffico di rete sopra indicato. A partire da Android 9, il metodo restituisce true per i dati delle celle, ma quando in un giorno si accumula più di una determinata quantità di traffico, inizia a restituire false. Le app eseguite su Android 9 devono chiamare il metodo e rispettare questo suggerimento.

La classe ConnectivityManager.NetworkCallback ora invia informazioni sulle VPN alle app. Questa modifica semplifica l'ascolto degli eventi di connettività da parte delle app, senza dover combinare chiamate sincrone e asincrone e utilizzare API limitate. Inoltre, significa che il trasferimento di informazioni funziona come previsto quando un dispositivo è connesso a più reti Wi-Fi o a più reti cellulari contemporaneamente.

Ritiro del client HTTP Apache

Con Android 6.0, abbiamo rimosso il supporto per il client HTTP Apache. A partire da Android 9, la libreria viene rimossa da bootclasspath e non è disponibile per le app per impostazione predefinita.

Per continuare a utilizzare il client HTTP Apache, le app destinate ad Android 9 e versioni successive possono aggiungere quanto segue a AndroidManifest.xml:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

In alternativa all'utilizzo della libreria Apache di runtime, le app possono raggruppare la propria versione della libreria org.apache.http nell'APK. In questo caso, devi creare un nuovo pacchetto della libreria (con un'utilità come Jar Jar) per evitare problemi di compatibilità delle classi con le classi fornite nel runtime.

Modifiche alla UI

Visualizza obiettivo

Le visualizzazioni con area 0 (la larghezza o l'altezza sono pari a 0) non sono più attivabili.

Inoltre, le attività non assegnano più implicitamente lo stato attivo iniziale in modalità tocco. Spetta invece a te richiedere esplicitamente l'attenzione iniziale, se vuoi.

Gestione del valore esadecimale CSS RGBA

Le app destinate ad Android 9 o versioni successive devono abilitare il comportamento della bozza Livello 4 del modulo colore CSS per la gestione dei colori CSS con 4 e 8 cifre esadecimali.

CSS Color Module Level 4 è supportato da Chrome sin dalla release 52, ma al momento WebView disattiva la funzionalità perché è stato rilevato che le app per Android esistenti contengono colori esadecimali a 32 bit nell'ordinamento Android (ARGB), il che causerebbe errori di rendering.

Ad esempio, il colore #80ff8080 viene attualmente visualizzato in WebView come rosso chiaro opaco (#ff8080) per le app che hanno come target livelli API 27 o precedenti. Il componente principale (che verrebbe interpretato da Android come componente alpha) viene attualmente ignorato. Se un'app ha come target il livello API 28 o successivo, #80ff8080 viene interpretato come verde chiaro trasparente al 50% (#80ff80).

Sniffing di tipo MIME per il file: URI

Le versioni di Android precedenti ad Android 9 potrebbero dedurre i tipi MIME dai contenuti dei file. A partire da Android 9 (livello API 28) le app devono utilizzare l'estensione del file corretta durante il caricamento degli URI file: in un componente WebView.

L'utilizzo dei contenuti del file per dedurre i tipi MIME può essere fonte di bug di sicurezza, e questo non è generalmente consentito dai browser moderni.

Se un file ha un'estensione riconosciuta, come .html, .txt, .js o .css, il tipo MIME verrà determinato dall'estensione. Se un file non ha estensione o se non è riconosciuto, il tipo MIME sarà di testo normale.

Ad esempio, un URI come file:///sdcard/test.html verrà visualizzato come HTML, mentre un URI come file:///sdcard/test verrà visualizzato come testo normale, anche se il file contiene dati HTML.

Elemento di scorrimento del documento

Android 9 gestisce correttamente il caso in cui l'elemento principale di un documento è l'elemento scorrevole. Nelle versioni precedenti, la posizione di scorrimento era impostata sull'elemento body e l'elemento principale non aveva valori di scorrimento. Android 9 consente il comportamento conforme agli standard in cui l'elemento di scorrimento è l'elemento principale.

Inoltre, l'accesso diretto a document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop o document.documentElement.scrollLeft comporta un comportamento diverso a seconda dell'SDK target. Per accedere ai valori di scorrimento dell'area visibile, utilizza document.scrollingElement, se disponibile.

Notifiche delle app sospese

Prima di Android 9, le notifiche delle app sospese venivano annullate. A partire da Android 9, le notifiche delle app sospese vengono nascoste fino a quando l'app non viene ripristinata.