Cambiamenti del comportamento: app che hanno come target il livello API 28 o versioni successive

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 livelli successivi. 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 di destinazione, consulta Modifiche al comportamento: tutte le app.

Servizi in primo piano

Le app che hanno come target Android 9 o versioni successive e utilizzano 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 che ha come target Android 9 o versioni successive tenta di creare un servizio in primo piano senza richiedere FOREGROUND_SERVICE, il sistema genera un SecurityException.

Modifiche alla privacy

Se la tua app ha come target Android 9, tieni presente le seguenti modifiche del comportamento. Questi aggiornamenti alle informazioni sul numero di serie e sul DNS del dispositivo migliorano la privacy degli utenti.

Deprecazione del numero di serie

In Android 9, 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 privato. In particolare, le app devono assicurarsi che, se il resolver di sistema utilizza DNS over TLS, qualsiasi client DNS integrato utilizzi DNS criptato per 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 al 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 attivato 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 attivare il testo non criptato per domini specifici, devi impostare esplicitamente cleartextTrafficPermitted su true per questi domini nella configurazione della sicurezza di rete della tua app.

Directory di dati basate sul web separate per processo

Per migliorare la stabilità delle app e l'integrità dei dati in Android 9, le app non possono condividere una singola directory di dati WebView tra più processi. In genere, queste directory di dati memorizzano cookie, cache HTTP e altri dati di archiviazione permanenti e temporanei relativi alla navigazione web.

Nella maggior parte dei casi, la tua 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 un WebView nello stesso processo. Puoi applicare in modo più rigoroso la regola "un solo processo" chiamando disableWebView() negli altri processi della tua app. Questa chiamata impedisce l'inizializzazione di WebView in altri processi per errore, anche se viene chiamata da una libreria dipendente.

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

Domini SELinux per app

Le app che hanno come target Android 9 o versioni successive non possono condividere dati con altre app utilizzando autorizzazioni Unix accessibili a livello globale. Questa modifica migliora l'integrità della sandbox applicazioni Android, in particolare il requisito che i dati privati di un'app siano accessibili solo da quell'app.

Per condividere file con altre app, utilizza un content provider.

Modifiche alla connettività

Conteggio dei dati di connettività e multipath

All'interno delle app che hanno come target Android 9 o versioni successive, il sistema conteggia il traffico di rete sulle reti che non sono quelle predefinite correnti, ad esempio il traffico cellulare mentre il dispositivo è connesso al Wi-Fi, e fornisce metodi nella classe NetworkStatsManager per eseguire query su questo traffico.

In particolare, getMultipathPreference() ora restituisce un valore basato sul traffico di rete sopra menzionato. A partire da Android 9, il metodo restituisce true per i dati cellulari, ma quando in un giorno si accumula un traffico superiore a un determinato valore, inizia a restituire false. Le app in esecuzione 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à da parte delle app senza dover combinare chiamate sincrone e asincrone e utilizzando 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, questa libreria viene rimossa dal bootclasspath e non è disponibile per le app per impostazione predefinita.

Per continuare a utilizzare il client HTTP Apache, le app che hanno come target Android 9 e versioni successive possono aggiungere quanto segue al file AndroidManifest.xml:

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

In alternativa all'utilizzo della libreria Apache runtime, le app possono includere la propria versione della libreria org.apache.http nel proprio APK. Se lo fai, devi ricompattare la libreria (con un'utilità come Jar Jar) per evitare problemi di compatibilità delle classi con le classi fornite nel runtime.

Modifiche all'interfaccia utente

Visualizzare lo stato attivo

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

Inoltre, le attività non assegnano più implicitamente lo stato attivo iniziale in modalità touch. Se vuoi, devi richiedere esplicitamente lo stato attivo iniziale.

Gestione del valore esadecimale RGBA del CSS

Le app che hanno come target Android 9 o versioni successive devono attivare il comportamento CSS Color Module Level 4 per la gestione dei colori CSS a 4 e 8 cifre esadecimali.

Il modulo CSS Color Level 4 è supportato da Chrome dalla release 52, ma WebView attualmente disattiva la funzionalità perché è stato rilevato che le applicazioni 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 i livelli API 27 o precedenti. Il componente principale (che Android interpreta come il componente alfa) viene ignorato al momento. Se un'app ha come target il livello API 28 o superiore, #80ff8080 viene interpretato come verde chiaro trasparente al 50% (#80ff80).

Rilevamento del tipo MIME per gli URI file

Le versioni di Android precedenti ad Android 9 potevano dedurre i tipi MIME dai contenuti del file. A partire da Android 9 (livello API 28), le app devono utilizzare l'estensione corretta quando caricano gli URI file: in una WebView.

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

Se un file ha un'estensione riconosciuta, ad esempio .html, .txt, .js o .css, il tipo MIME verrà determinato dall'estensione. Se un file non ha estensione o ne ha una non riconosciuta, il tipo MIME sarà testo normale.

Ad esempio, un URI come file:///sdcard/test.html verrà visualizzato come HTML, ma 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 radice di un documento è l'elemento di scorrimento. Nelle versioni precedenti, la posizione di scorrimento era impostata sull'elemento body e l'elemento radice aveva valori di scorrimento pari a zero. 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 si comporterà in modo diverso a seconda dell'SDK di destinazione. Per accedere ai valori di scorrimento del viewport, 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 finché l'app non viene ripristinata.