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.