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 versioni successive. App che impostano targetSdkVersion
sul livello API 28
di livello superiore devono modificare
le proprie app per supportare correttamente questi comportamenti, ove applicabile.
Per le modifiche che interessano tutte le app eseguite su Android 9, indipendentemente dall'API il livello scelto come target, Cambiamenti di comportamento: tutte le app.
Servizi in primo piano
Le app destinate ad Android 9 o versioni successive che utilizzano servizi in primo piano devono richiedere
FOREGROUND_SERVICE
autorizzazione. Si tratta di un'autorizzazione normale,
in modo che il sistema lo concedi
automaticamente all'app che ha inviato la richiesta.
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, devi mantenere quanto segue di comportamento dei dipendenti. Questi aggiornamenti alle informazioni seriali e DNS del dispositivo migliorare la privacy degli utenti.
Ritiro del numero di serie della build
In Android 9, Build.SERIAL
è
sempre impostata su "UNKNOWN"
per proteggere gli utenti privacy.
Se la tua app deve accedere al numero di serie hardware di un dispositivo, devi
richiedi invece
READ_PHONE_STATE
autorizzazione, quindi chiama
getSerial()
.
Privacy DNS
Le app che hanno come target Android 9 devono rispettare le API DNS private. In particolare, devono fare in modo che, se il resolver di sistema applica il protocollo DNS over TLS, il client DNS integrato utilizza il DNS criptato con lo stesso nome host del o viene disabilitata a favore del resolver di sistema.
Modifiche alla sicurezza del framework
Android 9 include diverse modifiche del comportamento che migliorano sicurezza dell'app, ma queste modifiche vengono applicate soltanto se l'app ha come target il livello API 28 o superiore.
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 attivare il testo non criptato per alcuni domini specifici, devi impostare esplicitamente cleartextTrafficPermitted
su true
per questi 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 delle app in Android 9, le app non possono
condividere un singolo dato di WebView
directory tra
più processi. In genere,
tali directory dei dati memorizzano cookie, cache HTTP e altre risorse
spazio di archiviazione temporaneo per la navigazione sul web.
Nella maggior parte dei casi, l'app dovrebbe utilizzare classi del
android.webkit
, ad esempio
come WebView
e
CookieManager
, in uno solo
e il processo di sviluppo. Ad esempio, devi spostare tutti
Activity
oggetti che utilizzano un WebView
nello stesso processo. Puoi applicare in modo più rigoroso il "solo processo" regola
chiamando
disableWebView()
pollici
altri processi dell'app. Questa chiamata impedisce l'inizializzazione di WebView
in questi altri processi per errore, anche se viene chiamato da un
libreria.
Se la tua app deve utilizzare istanze di
WebView
in più processi,
devi assegnare un suffisso univoco alla directory dei dati per ogni processo, utilizzando
WebView.setDataDirectorySuffix()
prima di utilizzare una determinata istanza di WebView
in quel processo. Questo metodo colloca i dati web di ogni processo nella relativa 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 che utilizzano autorizzazioni Unix accessibili a livello mondiale. Questa modifica migliora l'integrità Sandbox per le applicazioni Android in particolare il requisito secondo cui dati privati accessibili solo da quell'app.
Per condividere file con altre app, utilizza un fornitore di contenuti.
Modifiche alla connettività
Conteggio dei dati sulla connettività e multipath
Nelle app destinate ad Android 9 o versioni successive, il sistema conteggia il traffico di rete sulle reti che non sono quelle predefinite attuali, ad esempio il traffico cellulare quando 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 indicato. A partire da Android 9, il metodo restituisce true
per i dati di rete, ma quando in un giorno si accumula più di una determinata quantità di traffico, inizia a restituire false
. App in esecuzione su
Android 9 deve chiamare il metodo e rispettare questo suggerimento.
La classe ConnectivityManager.NetworkCallback
ora invia informazioni sulle VPN alle app. Questa modifica rende molto più facile
consente alle app di ascoltare gli eventi di connettività senza dover combinare tra loro
chiamate asincrone e l'uso di API limitate. Inoltre, significa che il trasferimento di informazioni funziona come previsto quando un dispositivo è connesso contemporaneamente a più reti Wi-Fi o a più reti cellulari.
Deprecazione 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 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 proprio AndroidManifest.xml
:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
In alternativa all'uso della libreria Apache runtime, le app possono raggruppare
la propria versione della libreria org.apache.http
nell'APK. In questo caso,
devi eseguire il nuovo pacchettizzazione della libreria (con un'utilità come
Jar Jar) per evitare problemi di compatibilità delle classi
con le classi fornite in runtime.
Modifiche all'interfaccia utente
Visualizza focus
Le viste con un'area pari a 0 (la larghezza o l'altezza è pari a 0) non sono più attivabili.
Inoltre, le attività non assegnano più implicitamente l'attenzione iniziale modalità tocco. Spetta a te richiedere esplicitamente lo stato attivo iniziale, se lo desideri.
Gestione dei valori esadecimale RGBA CSS
Le app che hanno come target Android 9 o versioni successive devono attivare il comportamento della bozza del Modulo di colori CSS di livello 4 per la gestione dei colori CSS a 4 e 8 cifre esadecimali.
Il Modulo dei colori CSS di livello 4 è supportato da Chrome dalla versione 52, ma al momento WebView disattiva la funzionalità perché è stato rilevato che le applicazioni Android esistenti contengono colori esadecimali a 32 bit nell'ordinamento Android (ARGB), il che potrebbe causare errori di rendering.
Ad esempio, al momento il colore #80ff8080
è visualizzato in
WebView come opaco
rosso chiaro (#ff8080
) per le app che hanno come target livelli API 27 o precedenti. Il componente iniziale (che verrebbe interpretato da Android come componente alfa) è attualmente ignorato. Se un'app ha come target il livello API 28 o superiore, #80ff8080
è
interpretato come verde chiaro trasparente al 50% (#80ff80
).
Rilevamento del tipo MIME per il file: URI
Le versioni di Android precedenti ad Android 9 potevano dedurre i tipi MIME dal file
contenuti. A partire da Android 9 (livello API 28), le app devono utilizzare l'estensione del file corretta quando caricano gli URI file:
in un WebView.
L'utilizzo dei contenuti del file per dedurre i tipi MIME può essere fonte di bug di sicurezza e in genere non è consentito dai browser moderni.
Se un file ha un'estensione di file riconosciuta, ad esempio .html
,
.txt
, .js
o .css
: il tipo MIME verrà determinato dall'estensione.
Se un file non ha estensione o non è riconosciuto, il tipo MIME sarà normale
testo.
Ad esempio, un URI come file:///sdcard/test.html
verrà eseguito 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 sia l'elemento di scorrimento. Nelle versioni precedenti, la posizione di scorrimento era impostata sull'elemento body; l'elemento principale aveva valori di scorrimento pari a zero. Android 9 consente comportamento conforme agli standard in cui l'elemento di scorrimento rappresenta la radice .
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 target. Per accedere ai valori di scorrimento della visualizzazione, utilizza document.scrollingElement
, se disponibile.
Notifiche di 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 a l'app viene ripresa.