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 successivo. 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 eseguite 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 SecurityException.

Modifiche relative alla privacy

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

Ritiro del numero di serie della build

In Android 9, l'app Build.SERIAL è sempre impostata 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, quindi 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 esegue DNS over TLS, qualsiasi client DNS integrato utilizzi il DNS criptato con lo stesso nome host del sistema o sia disattivato 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 vengono applicate soltanto se la tua app ha come target il livello API 28 o successivo.

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 di 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, ad esempio 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 un processo" chiamando disableWebView() negli altri processi dell'app. Questa chiamata impedisce che WebView venga inizializzato per errore in questi altri processi, 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 per ogni processo, utilizzando il metodo WebView.setDataDirectorySuffix(), prima di utilizzare una determinata istanza di WebView in quel 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 Sandbox per le applicazioni Android, in particolare il requisito secondo cui i dati privati di un'app sono accessibili soltanto a quell'app.

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

Modifiche alla connettività

Conteggio dei dati relativi alla connettività e multipercorso

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 delle celle quando il dispositivo è connesso al Wi-Fi, e fornisce metodi nella classe NetworkStatsManager per eseguire query su questo traffico.

In particolare, ora getMultipathPreference() restituisce un valore basato sul traffico di rete indicato sopra. 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 notevolmente l'ascolto degli eventi di connettività per le app senza dover combinare chiamate sincrone e asincrone e utilizzare API limitate. Inoltre, 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 dal percorso 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 nel proprio 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 stato attivo

Non è più possibile attivare le visualizzazioni con area 0 (larghezza o altezza pari a 0).

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 CSS Color Module Level 4 per la gestione dei colori CSS a 4 e 8 cifre esadecimali.

CSS Color Module Level 4 è supportato da Chrome sin dalla release 52, ma WebView al momento 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, al momento il colore #80ff8080 viene visualizzato in WebView come rosso chiaro opaco (#ff8080) per le app che hanno come target i 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 del tipo MIME per il file: URI

Le versioni di Android precedenti ad Android 9 potevano 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 sarà determinato dall'estensione. Se un file non ha estensione o una non riconosciuta, il tipo MIME sarà testo normale.

Ad esempio, un URI come file:///sdcard/test.html verrà visualizzato in 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 aveva valori di scorrimento pari a zero. Android 9 attiva 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, usa 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 sono nascoste fino al ripristino dell'app.