Modifiche del comportamento di Android 8.0

Oltre alle nuove funzionalità, Android 8.0 (livello API 26) include una serie di modifiche al comportamento del sistema e delle API. Questo documento evidenzia alcune delle modifiche chiave che dovresti comprendere e tenere in considerazione nelle tue app.

La maggior parte di queste modifiche interessa tutte le app, indipendentemente dalla versione Android sceglie come target. Tuttavia, diverse modifiche interessano solo il targeting per app Android 8.0 e versioni successive. Per massimizzare la chiarezza, è divisa in due sezioni: Modifiche per tutte le app e Modifiche al targeting per app Android 8.0.

Modifiche per tutte le app

Queste modifiche del comportamento si applicano a tutte le app quando vengono eseguiti sulla piattaforma Android 8.0 (livello API 26), indipendentemente il livello API scelto come target. Tutti gli sviluppatori sono tenuti a esaminare queste modifiche e le app per supportarle correttamente, ove applicabile all'app.

Limiti di esecuzione in background

Una delle modifiche introdotte da Android 8.0 (livello API 26) migliorare la durata della batteria, quando l'app accede memorizzati nella cache senza stato attivo componenti, il sistema rilascia eventuali wakelock bloccati dall'app.

Inoltre, per migliorare le prestazioni dei dispositivi, il sistema limita alcuni i comportamenti delle app che non vengono eseguite in primo piano. Nello specifico:

  • Le app eseguite in background ora hanno limiti sulla libertà possono accedere ai servizi in background.
  • Le app non possono utilizzare i relativi manifest per registrarsi per la maggior parte delle trasmissioni implicite (ovvero gli annunci che non sono specificamente destinati all'app).

Per impostazione predefinita, queste limitazioni si applicano soltanto alle app che hanno come target O. Tuttavia, gli utenti possono attivare queste limitazioni per qualsiasi app dalla schermata Impostazioni, anche se l'app non ha come target O.

Android 8.0 (livello API 26) include anche le seguenti modifiche a metodi specifici:

  • Il metodo startService() ora genera un IllegalStateException se un'app che ha come target Android 8.0 prova a usare quel metodo in una situazione in cui non è consentito creare servizi in background.
  • Il nuovo metodo Context.startForegroundService() avvia un servizio in primo piano. Il sistema consente alle app per chiamare Context.startForegroundService() anche mentre l'app è in background. Tuttavia, l'app deve chiamare il metodo startForeground() del servizio entro cinque secondi dopo la creazione del servizio.

Per ulteriori informazioni, vedi Limiti di esecuzione in background.

Limiti della posizione in background di Android

Per preservare la batteria, l'esperienza utente e l'integrità del sistema, le app in background ricevono gli aggiornamenti sulla posizione con minore frequenza quando vengono utilizzate su un dispositivo con Android 8.0. Questa modifica del comportamento interessa tutte le app che ricevono aggiornamenti sulla posizione, incluso Google Play Services.

Queste modifiche interessano le seguenti API:

  • Fused Location Provider (FLP)
  • Geofencing
  • Misurazioni GNSS
  • Gestore delle sedi
  • Gestore Wi-Fi

Per assicurarti che l'app venga eseguita come previsto, completa i seguenti passaggi:

  • Esamina la logica dell'app e assicurati di utilizzare la posizione più recente su quelle di livello inferiore.
  • Verifica che l'app presenti il comportamento previsto per ogni utilizzo per verificare se è così.
  • Valuta l'uso della classe Fuso Location Provider (FLP) o geofencing per gestire i casi d'uso che dipendono la posizione attuale dell'utente.

Per ulteriori informazioni su queste modifiche, vedi Posizione in background Limiti.

Scorciatoie app

Android 8.0 (livello API 26) include le seguenti modifiche alle scorciatoie app:

  • La trasmissione com.android.launcher.action.INSTALL_SHORTCUT non ha non abbia più effetto sulla tua app, perché ora è una la trasmissione. Crea invece una scorciatoia app utilizzando il metodo requestPinShortcut() della classe ShortcutManager.
  • ACTION_CREATE_SHORTCUT ora l'intent può creare scorciatoie app che gestisci utilizzando ShortcutManager corso. Questo intent può anche creare scorciatoie di Avvio applicazioni precedenti che non interagiscono con ShortcutManager. In precedenza, questo intent poteva creare solo scorciatoie precedenti per Avvio applicazioni.
  • Scorciatoie create utilizzando requestPinShortcut() e le scorciatoie create in un'attività che gestisce ACTION_CREATE_SHORTCUT sono ora scorciatoie a tutti gli effetti. Di conseguenza, ora le app possono aggiornarle utilizzando i metodi in ShortcutManager.
  • Le scorciatoie precedenti conservano le funzionalità delle versioni precedenti di su Android, ma devi convertirli manualmente in scorciatoie app all'interno dell'app.

Per ulteriori informazioni sulle modifiche alle scorciatoie app, consulta le Bloccare le scorciatoie e Guida alle funzionalità dei widget.

Impostazioni internazionali e internazionalizzazione

Android 7.0 (livello API 24) ha introdotto il concetto di poter specificare impostazioni internazionali della categoria predefinite, ma alcune API hanno continuato a utilizzare Locale.getDefault() generico senza argomenti, quando invece dovrebbero aver utilizzato le impostazioni internazionali della categoria DISPLAY predefinite. In Android 8.0 (livello API 26), la i seguenti metodi ora usano Locale.getDefault(Category.DISPLAY) anziché Locale.getDefault():

Anche Locale.getDisplayScript(Locale) torna a Locale.getDefault() quando Valore displayScript specificato per Locale non è disponibile.

Ulteriori modifiche relative alle impostazioni internazionali e all'internazionalizzazione sono che segue:

  • Chiamata a Currency.getDisplayName(null) genera un NullPointerException, che corrisponde al comportamento documentato.
  • L'analisi del nome del fuso orario è cambiata. In precedenza, I dispositivi Android hanno utilizzato il valore dell'orologio di sistema campionato all'avvio ora per memorizzare nella cache i nomi dei fusi orari utilizzati per l'analisi della data volte. Di conseguenza, l'analisi potrebbe risentirne negativamente se il sistema l'orologio era sbagliato al momento dell'avvio o in altri casi più rari.

    Nei casi comuni, la logica di analisi utilizza l'ICU e l'attuale valore dell'orologio di sistema durante l'analisi dei nomi dei fusi orari. Questo modifica fornisce risultati più corretti, che possono differire da quelli Le versioni di Android quando la tua app utilizza corsi come SimpleDateFormat.

  • Android 8.0 (livello API 26) aggiorna la versione di ICU alla versione 58.

Finestre di avviso

Se un'app utilizza SYSTEM_ALERT_WINDOW autorizzazione e usa uno dei seguenti tipi di finestre per tentare di visualizzare finestre di avviso sopra altre app e finestre di sistema:

...queste finestre vengono sempre visualizzate sotto quelle che utilizzano TYPE_APPLICATION_OVERLAY finestra di testo. Se un'app ha come target Android 8.0 (livello API 26), utilizza la classe TYPE_APPLICATION_OVERLAY tipo di finestra per visualizzare le finestre di avviso.

Per ulteriori informazioni, consulta la sezione Tipi di finestre comuni per sezione Finestre di avviso nelle modifiche del comportamento per le App che hanno come target Android 8.0.

Input e navigazione

Con l'avvento delle app per Android su ChromeOS e su altri fattori di forma di grandi dimensioni, come i tablet, stiamo assistendo a una ripresa dell'utilizzo della navigazione da tastiera all'interno App per Android. In Android 8.0 (livello API 26), abbiamo la tastiera come dispositivo di input per la navigazione, offrendo una maggiore affidabilità, più prevedibile per la navigazione basata su frecce e schede.

In particolare, abbiamo apportato le seguenti modifiche all'elemento attivo comportamento:

  • Se non hai definito alcun colore dello stato di messa a fuoco per un Oggetto View (primo piano o sfondo) drawable), il framework ora imposta un colore predefinito di evidenziazione per l'elemento View. L'evidenziazione in primo piano è un'eco disegnabile in base al tema dell'attività.

    Se non vuoi che un oggetto View utilizzi questo valore predefinito evidenziare quando riceve lo stato attivo, imposta Attributo android:defaultFocusHighlightEnabled a false nel file XML di layout contenente View o passa in false a setDefaultFocusHighlightEnabled() nella logica UI della tua app.

  • Per verificare in che modo l'input da tastiera influisce sull'elemento attivo dell'elemento UI, puoi attivare il metodo Disegno > Opzione sviluppatore Mostra limiti di layout. Su Android 8.0, questa opzione visualizza una "X" icona sopra l'elemento che al momento è il focus.

Inoltre, tutti gli elementi della barra degli strumenti di Android 8.0 vengono cluster di navigazione con tastiera, rendendo più facile per gli utenti entrare e uscire da ogni barra degli strumenti come tutto.

Per scoprire di più su come migliorare il supporto della navigazione da tastiera all'interno leggere l'articolo Informazioni sull'assistenza Guida alla navigazione con tastiera.

Compilazione automatica dei moduli web

Ora che la funzionalità Compilazione automatica di Android Framework, che fornisce supporto integrato per la funzionalità di compilazione automatica, i seguenti metodi relativi a WebView oggetti sono cambiati Per le app installate su dispositivi con Android 8.0 (livello API 26):

WebSettings
  • La getSaveFormData() ora restituisce false. In precedenza, questo metodo restituiva true in alternativa.
  • Chiamata in corso No: setSaveFormData() non avrà più effetto.
WebViewDatabase
  • Chiamata in corso No: clearFormData() non avrà più effetto.
  • La hasFormData() metodo ora restituisce false. In precedenza, questo metodo restituiva true quando il modulo conteneva dati.

Accessibilità

Android 8.0 (livello API 26) include le seguenti modifiche all'accessibilità:

  • Il framework di accessibilità ora converte tutti i gesti del doppio tocco in ACTION_CLICK azioni. Questa modifica consente a TalkBack di comportarsi come di accessibilità di Google.

    Se gli oggetti View dell'app utilizzano il tocco personalizzato devi verificare che funzionino ancora con TalkBack. Potresti devi solo registrare il gestore dei clic View per l'utilizzo di oggetti. Se TalkBack continua a non riconoscere i gesti eseguiti su questi View oggetti, override performAccessibilityAction().

  • I servizi di accessibilità sono ora a conoscenza di tutti ClickableSpan di istanze all'interno dell'infrastruttura dell'app TextView oggetti.

Per scoprire di più su come rendere la tua app più accessibile, vedi Accessibilità.

Networking e connettività HTTP(S)

Android 8.0 (livello API 26) include le seguenti modifiche del comportamento alle networking e connettività HTTP(S):

  • Le richieste OPTIONS senza corpo hanno un Content-Length: 0 intestazione. In precedenza non avevano un'intestazione Content-Length.
  • HttpURLConnection normalizza gli URL contenenti percorsi vuoti aggiungendoli una barra dopo il nome dell'host o dell'autorità con una barra. Ad esempio, converte http://example.com in http://example.com/.
  • Un selettore proxy personalizzato impostato mediante ProxySelector.setDefault() sceglie come target solo l'indirizzo (schema, host e porta) di un URL richiesto. Di conseguenza, la selezione proxy può basarsi solo su questi valori. Un URL passati a un selettore proxy personalizzato non include i dati dell'URL richiesto un percorso, i parametri di query o i frammenti.
  • Gli URI non possono contenere etichette vuote.

    In precedenza, la piattaforma supportava una soluzione alternativa per accettare etichette vuote in nomi host, un uso illegale degli URI. Questa soluzione alternativa era compatibilità con le versioni libcore precedenti. Sviluppatori che utilizzano l'API vedrebbe erroneamente un messaggio ADB: "URI example.com ha etichette vuote in il nome host. Questo formato non è valido e non verrà accettato in futuro su Android release". Android 8.0 rimuove questa soluzione alternativa; il sistema restituisce null per URI in formato non corretto.

  • Implementazione di HttpsURLConnection su Android 8.0 non esegue una versione di riserva del protocollo TLS/SSL non sicuro.
  • La gestione delle connessioni HTTP(S) di tunneling è cambiata come segue:
    • Durante il tunneling della connessione HTTPS tramite connessione, il sistema posiziona correttamente il numero di porta (:443) nella riga Host quando a un server intermedio. In precedenza, la porta numero è presente solo nella riga CONNECT.
    • Il sistema non invia più lo user agent e l'autorizzazione del proxy da una richiesta in tunnel al server proxy.

      Il sistema non invia più un'intestazione di autorizzazione proxy su un ha effettuato il tunneling dell'HTTP(s)URLConnection al proxy durante la configurazione tunnel. Il sistema genera invece un'intestazione di autorizzazione proxy, e la invia al proxy quando quest'ultimo invia HTTP 407 in risposta alla richiesta iniziale.

      Analogamente, il sistema non copia più l'intestazione user-agent dalla richiesta in tunnel alla richiesta proxy che configura tunnel. La libreria genera invece un'intestazione user agent corrispondente richiesta.

  • send(java.net.DatagramPacket) genera una SocketException se l'istruzione connect() eseguita in precedenza non riuscito.
    • DatagramSocket.connect() imposta un pendingSocketException se è presente errore interno. Prima di Android 8.0, una successiva funzione recv() ha generato una SocketEccezioni anche se una chiamata send() sarebbe andata a buon fine. Per coerenza, per entrambe le chiamate viene generata una SocketEccezioni.
  • InetAddress.isReachable() tenta di utilizzare ICMP prima di utilizzare l'eco TCP protocollo.
    • Alcuni host che bloccano la porta 7 (Echo TCP), come google.com, possono ora diventano raggiungibili se accettano il protocollo Echo ICMP.
    • Per gli host realmente non raggiungibili, questa modifica significa che il doppio della quantità di tempo trascorso prima che la chiamata ritorni.

Bluetooth

Android 8.0 (livello API 26) apporta le seguenti modifiche alla durata di i dati di cui ScanRecord.getBytes() recupera:

  • Il metodo getBytes() non fa ipotesi il numero di byte ricevuti. Di conseguenza, le app non devono fare affidamento il numero minimo o massimo di byte restituiti. Dovrebbe invece valutare la lunghezza dell'array risultante.
  • I dispositivi compatibili con Bluetooth 5 potrebbero restituire dati di lunghezza superiore a precedente massimo di circa 60 byte.
  • Se un dispositivo remoto non fornisce una risposta alla scansione, deve avere una dimensione inferiore a 60 byte possono essere restituiti.

Connettività senza interruzioni

Android 8.0 (livello API 26) apporta una serie di miglioramenti alle impostazioni Wi-Fi per facilitare la scelta la rete Wi-Fi che offre la migliore esperienza utente. Le modifiche specifiche includono:

  • Miglioramenti della stabilità e dell'affidabilità.
  • Un'interfaccia utente più intuitiva.
  • Un unico menu consolidato Preferenze Wi-Fi.
  • Sui dispositivi compatibili, attivazione automatica del Wi-Fi quando una rete salvata di alta qualità nelle vicinanze.

Sicurezza

Android 8.0 include i seguenti aspetti relativi alla sicurezza modifiche:

  • La piattaforma non supporta più SSLv3.
  • Quando viene stabilita una connessione HTTPS a un server che non ha implementa la negoziazione della versione del protocollo TLS HttpsURLConnection non tenta più di provare la soluzione alternativa di tornare a versioni precedenti del protocollo TLS e riprovare.
  • Android 8.0 (livello API 26) applica una certificazione Secure Computing (SECCOMP) filtra per tutte le app. L'elenco di chiamate di sistema consentite è limitato a quelle esposto attraverso la tecnologia bionica. Anche se sono disponibili diverse altre chiamate di sistema, per compatibilità con le versioni precedenti, ne sconsigliamo l'uso.
  • WebView di oggetti della tua app ora vengono eseguiti in più processi . I contenuti web vengono gestiti in un processo separato e isolato rispetto contenente il processo dell'app per una maggiore sicurezza.
  • Non è più possibile presumere che gli APK si trovino in directory il cui nome termina in -1 o -2. Le app devono utilizzare sourceDir per ottenere senza fare affidamento direttamente sul formato della directory.
  • Per informazioni sui miglioramenti della sicurezza relativi all'uso librerie, consulta Librerie native.

Inoltre, Android 8.0 (livello API 26) introduce le seguenti modifiche relative all'installazione app sconosciute da fonti sconosciute:

Per ulteriori dettagli sull'installazione di app sconosciute, consulta le App sconosciuta Guida alle autorizzazioni di installazione.

Per ulteriori linee guida su come rendere la tua app più sicura, vedi Sicurezza per gli sviluppatori Android.

Privacy

Android 8.0 (livello API 26) rende le seguenti informazioni relative alla privacy modifiche alla piattaforma.

  • La piattaforma ora gestisce gli identificatori in modo diverso.
    • Per le app che sono state installate prima di un'aggiornamento OTA a una versione di Android 8.0 (livello API 26) (livello API 26), il valore ANDROID_ID rimane invariato a meno che non venga disinstallato e poi reinstallato dopo l'aggiornamento OTA. Per conservare i valori in disinstallazioni dopo OTA, gli sviluppatori possono associare i valori vecchio e nuovo utilizzando Backup chiave/valore.
    • Per le app installate su un dispositivo con Android 8.0, il valore di L'ambito è ora limitato a ANDROID_ID per chiave di firma dell'app e per utente. Il valore di ANDROID_ID è univoco per ogni combinazione di chiave di firma dell'app, utente e dispositivo. Di conseguenza, app con chiavi di firma diverse in esecuzione sullo stesso dispositivo non vedranno più lo stesso ID Android (anche per lo stesso utente).
    • Il valore di ANDROID_ID non cambia al momento della disinstallazione o reinstallazione del pacchetto, purché di firma è la stessa (e l'app non è stata installata prima di un'OTA di di Android 8.0).
    • Il valore di ANDROID_ID non cambia anche se un aggiornamento di sistema causa la modifica della chiave di firma del pacchetto.
    • Sui dispositivi che spediscono con Google Play Services e l'ID pubblicità: devi utilizzare ID pubblicità. Un sistema semplice e standard per monetizzare le app, L'ID pubblicità è un ID univoco, reimpostabile dall'utente per la pubblicità. Viene fornito da Google Play Services.

      Gli altri produttori di dispositivi dovrebbero continuare per fornire ANDROID_ID.

  • Una query sulla proprietà di sistema net.hostname produce un valore nullo. o il risultato finale.

Logging delle eccezioni non rilevate

Se un'app installa un Thread.UncaughtExceptionHandler che non chiamare il Thread.UncaughtExceptionHandler predefinito, il sistema non terminare l'app quando si verifica un'eccezione non rilevata. A partire da Android 8.0 (livello API 26), il sistema registra lo stacktrace delle eccezioni in questo la situazione attuale; nelle versioni precedenti della piattaforma, il sistema non avrebbe ha registrato lo stacktrace delle eccezioni.

Consigliamo l'impostazione personalizzata di Thread.UncaughtExceptionHandler le implementazioni richiamano sempre il gestore predefinito; le app che seguono questo consiglio non sono interessate da la modifica in Android 8.0.

modifica della firma FindViewById()

Tutte le istanze del metodo findViewById() ora restituiscono <T extends View> T anziché View. Questa modifica ha le seguenti implicazioni:

  • Ciò può causare un tipo restituito ambiguo per il codice esistente, ad esempio se sono presenti sia someMethod(View) che someMethod(TextView) che riceve il risultato di una chiamata a findViewById().
  • Quando si utilizza il linguaggio di origine Java 8, è necessaria una trasmissione esplicita View quando il tipo restituito non è vincolato (ad esempio, assertNotNull(findViewById(...)).someViewMethod()).
  • Override dei metodi findViewById() non finali (ad ad esempio Activity.findViewById()) dovranno restituire un reso tipo aggiornato.

Modifica delle statistiche di utilizzo del provider di contatti

Nelle versioni precedenti di Android, il componente Provider di contatti consente agli sviluppatori di ottenere dati sull'utilizzo per ogni contatto. Questi dati sull'utilizzo mostra informazioni per ogni indirizzo email e ogni numero di telefono associato con un contatto, incluso il numero di volte in cui il contatto è stato contattato. e l'ultima volta che il contatto è stato contattato. App che richiedono READ_CONTACTS può leggere questi dati.

Le app possono comunque leggere questi dati se lo richiedono READ_CONTACTS autorizzazione. In Android 8.0 (livello API 26) e versioni successive, vengono restituite le query per i dati sull'utilizzo. piuttosto che con valori esatti. Il sistema Android mantiene i valori esatti, pertanto questa modifica non influisce l'API di autocomplete.

Questa modifica del comportamento influisce sui seguenti parametri di query:

Gestione della raccolta

AbstractCollection.removeAll() e AbstractCollection.retainAll() ora genera sempre un NullPointerException; in precedenza, NullPointerException non è stato generato quando la raccolta è stata vuoto. Questa modifica rende il comportamento coerente con la documentazione.

Android Enterprise

Android 8.0 (livello API 26) modifica le comportamento di alcune API e funzionalità per le app aziendali, incluso il dispositivo controller dei criteri (DPC). Le modifiche includono:

  • Nuovi comportamenti per consentire alle app di supportare i profili di lavoro su dispositivi completamente gestiti.
  • Modifiche alla gestione degli aggiornamenti di sistema, alla verifica delle app e all'autenticazione in migliorare l'integrità del dispositivo e del sistema.
  • Miglioramenti all'esperienza utente per provisioning, notifiche, Schermata Recenti e VPN sempre attiva.

Per vedere tutte le modifiche aziendali in Android 8.0 (livello API 26) e scoprire come potrebbero influisce sulla tua app, leggi Android in azienda.

App che hanno come target Android 8.0

Queste modifiche del comportamento si applicano esclusivamente alle app scelte come target Android 8.0 (livello API 26) o versioni successive. App che si compilano in base ad Android 8.0, oppure imposta targetSdkVersion su Android 8.0 o versioni successive. È necessario modificare le proprie app per supportare correttamente questi comportamenti, ove applicabile.

Finestre di avviso

App che usano SYSTEM_ALERT_WINDOW l'autorizzazione non può più usare i seguenti tipi di finestre per visualizzare finestre di avviso sopra altre app e finestre di sistema:

Le app devono invece usare un nuovo tipo di finestra chiamato TYPE_APPLICATION_OVERLAY.

Quando utilizzi il TYPE_APPLICATION_OVERLAY finestra digita le finestre di avviso per la tua app, mantieni le seguenti caratteristiche del nuovo tipo di finestra:

  • Le finestre di avviso di un'app vengono sempre visualizzate sotto le finestre di sistema critiche, ad esempio come barra di stato e IME.
  • Il sistema può spostare o ridimensionare le finestre che utilizzano TYPE_APPLICATION_OVERLAY tipo di finestra per migliorare la presentazione sullo schermo.
  • Aprendo l'area notifiche, gli utenti possono accedere alle impostazioni per bloccare un di mostrare le finestre di avviso mostrate utilizzando TYPE_APPLICATION_OVERLAY tipo di finestra.

Notifiche di modifica dei contenuti

Android 8.0 (livello API 26) cambia il modo ContentResolver.notifyChange() e registerContentObserver(Uri, boolean, ContentObserver) per le app che hanno come target Android 8.0.

Queste API ora richiedono che sia ContentProvider viene definito per l'autorità in tutti gli URI. La definizione di un valore ContentProvider valido con le autorizzazioni pertinenti contribuiscono a difendere la tua app dalle modifiche ai contenuti apportate da app dannose e a dalla fuga di dati potenzialmente privati ad app dannose.

Visualizza focus

Gli oggetti View selezionabili ora sono ora attivabili anche da predefinito. Se vuoi che un oggetto View sia cliccabile, ma non attivabile, imposta Attributo android:focusable a false nel layout File XML contenente il View o pass in false a setFocusable() nell'interfaccia utente della tua app logica.

Corrispondenza user agent nel rilevamento del browser

Android 8.0 (livello API 26) e versioni successive includono il stringa identificatore di build OPR. Alcune corrispondenze di pattern possono far sì che la logica di rilevamento del browser identifichi erroneamente come Opera un browser non Opera. Un esempio di corrispondenza di pattern potrebbe essere:

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

Per evitare problemi derivanti da questa errata identificazione, utilizza una stringa diversa da OPR come corrispondenza di pattern per il browser Opera.

Sicurezza

Le modifiche seguenti influiscono sulla sicurezza in Android 8.0 (livello API 26):

  • Se la configurazione della sicurezza di rete della tua app attivazioni del supporto del traffico con testo in chiaro, il Gli oggetti WebView non possono accedere ai siti web tramite HTTP. Ciascuna L'oggetto WebView deve utilizzare HTTPS.
  • L'impostazione di sistema Consenti origini sconosciute è stata rimossa. nel suo posizione, l'autorizzazione Installa app sconosciute gestisce le installazioni di app sconosciute. provenienti da fonti sconosciute. Per ulteriori informazioni su questa nuova autorizzazione, consulta le App sconosciuta Guida alle autorizzazioni di installazione.

Per ulteriori linee guida su come rendere la tua app più sicura, vedi Sicurezza per gli sviluppatori Android.

Accesso all'account e rilevabilità

In Android 8.0 (livello API 26), le app non possono più avere accesso agli account utente, a meno che l'autenticatore non sia il proprietario degli account o che l'utente concede questo accesso. La Autorizzazione GET_ACCOUNTS non è più sufficiente. Per ottenere l'accesso a un account, le app devono usa AccountManager.newChooseAccountIntent() o un servizio specifico per l'autenticazione . Dopo aver ottenuto l'accesso agli account, un'app può chiamare AccountManager.getAccounts() per accedervi.

Android 8.0 verrà ritirato LOGIN_ACCOUNTS_CHANGED_ACTION. App dovrebbe invece utilizzare addOnAccountsUpdatedListener() per ricevere aggiornamenti sugli account durante l'esecuzione.

Per informazioni sulle nuove API e sui nuovi metodi aggiunti per l'accesso all'account e rilevabilità, consulta Accesso all'account e rilevabilità nella sezione Nuove API di questo documento.

Privacy

Le modifiche che seguono influiscono sulla privacy in Android 8.0 (livello API 26).

  • Le proprietà di sistema net.dns1, net.dns2, net.dns3 e net.dns4 non sono più una modifica che migliora la privacy sulla piattaforma.
  • Per ottenere informazioni di rete come i server DNS, le app con ACCESS_NETWORK_STATE può registrare un NetworkRequest o NetworkCallback oggetto. Queste classi sono disponibili in Android 5.0 (livello API 21) e versioni successive.
  • Il file Build.SERIAL è deprecato. Le app che necessitano di conoscere il numero di serie hardware utilizza il nuovo metodo Build.getSerial(), che richiede READ_PHONE_STATE autorizzazione.
  • L'API LauncherApps non consente più il profilo di lavoro per ottenere informazioni sul profilo principale. Quando un utente è al lavoro profilo, l'API LauncherApps si comporta come se non fosse presente sono installati in altri profili all'interno dello stesso gruppo di profili. Come abbiamo fatto prima, i tentativi di accedere a profili non correlati causano SecurityEccezioni.

Autorizzazioni

Prima di Android 8.0 (livello API 26), se un'app richiedeva un'autorizzazione in fase di runtime e l'autorizzazione è stata concessa, il sistema ha concesso all'app le restanti autorizzazioni appartenenti alla stessa gruppo di autorizzazioni di accesso e che sono state registrate nel file manifest.

Per le app che hanno come target Android 8.0, questo comportamento è stato corretti. All'app vengono concesse solo le autorizzazioni di cui dispone richiesto. Tuttavia, una volta che l'utente concede l'autorizzazione all'app, le richieste successive di autorizzazioni in quel gruppo concesso automaticamente.

Ad esempio, supponiamo che un'app includa sia READ_EXTERNAL_STORAGE che WRITE_EXTERNAL_STORAGE nel file manifest. L'app richiede READ_EXTERNAL_STORAGE e l'utente lo concede. Se l'app ha come target il livello API 25 o un livello precedente, il sistema concede WRITE_EXTERNAL_STORAGE contemporaneamente perché appartiene allo stesso gruppo di autorizzazioni STORAGE ed è anche registrati nel file manifest. Se l'app ha come target Android 8.0 (livello API 26), il sistema concede solo READ_EXTERNAL_STORAGE in quel momento; Tuttavia, se in un secondo momento l'app richiede WRITE_EXTERNAL_STORAGE, il sistema concede questo privilegio senza chiedere conferma all'utente.

Contenuti multimediali

  • Il framework può eseguire attenuazione automatica audio da solo. In questo caso, quando un'altra applicazione richiede lo stato attivo AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, l'applicazione con lo stato attivo riduce il volume ma di solito non riceve onAudioFocusChange() richiamarlo e non perdi il focus audio. Sono disponibili nuove API per eseguire l'override di questo comportamento e applicazioni che devono essere messe in pausa invece di "attenuare la pressione".
  • Quando l'utente risponde a una telefonata, l'audio degli stream multimediali attivi viene disattivato per l'intera durata della chiamata.
  • Tutte le API relative all'audio devono usare AudioAttributes anziché i tipi di stream audio per descrivere il caso d'uso della riproduzione audio. Continua a utilizzare i tipi di stream audio solo per i controlli del volume. Altri utilizzi dei tipi di stream continuano a funzionare (ad esempio, l'argomento streamType per la classe di conversione deprecata costruttore AudioTrack), ma il sistema lo registra come un errore.
  • Quando utilizzi un'AudioTrack, se l'applicazione richiede un buffer audio abbastanza grande, proverà a utilizzare l'output del deep buffer, se disponibile.
  • In Android 8.0 (livello API 26) la gestione degli eventi relativi ai pulsanti multimediali è diversa:
      .
    1. Gestione dei pulsanti multimediali in un'attività dell'interfaccia utente non è cambiata: le attività in primo piano hanno comunque la priorità nella gestione eventi del pulsante multimediale.
    2. Se l'attività in primo piano non gestisce l'evento del pulsante multimediale, il sistema instrada l'evento. all'app che ha riprodotto audio in locale più di recente. Stato attivo, segnalazioni e riproduzione lo stato di una sessione multimediale non vengono presi in considerazione per determinare quale app riceve contenuti multimediali eventi pulsante.
    3. Se la sessione multimediale dell'app è stata rilasciata, il sistema invia l'evento del pulsante multimediale all'app MediaButtonReceiver, se presente.
    4. In tutti gli altri casi, il sistema ignora l'evento del pulsante multimediale.

Librerie native

Nelle app che hanno come target Android 8.0 (livello API 26), le librerie native non a un caricamento più lungo se contengono segmenti di carico scrivibili e eseguibile. Alcune app potrebbero non funzionare più a causa di questa modifica se hanno librerie native con segmenti di caricamento errati. Si tratta di un misura di rafforzamento della sicurezza.

Per ulteriori informazioni, vedi Segmenti scrivibili ed eseguibili.

Le modifiche del linker sono legate al livello API scelto come target di un'app. Se ci sono è una modifica del linker al livello API target, l'app non può caricare la libreria. Se scegli come target un livello API inferiore a quello in cui si verifica la modifica del linker, logcat mostra un avviso.

Gestione della raccolta

In Android 8.0 (livello API 26), Collections.sort() è implementato in parte superiore di List.sort(). Il contrario era vera in Android 7.x (livelli API 24 e 25): L'implementazione predefinita di List.sort() chiamato Collections.sort().

Questa modifica consente a Collections.sort() per sfruttare i vantaggi di List.sort() implementazioni, ma prevede i seguenti vincoli:

  • Implementazioni di List.sort() non deve chiamare Collections.sort(), perché così facendo si comporterebbe uno overflow dello stack dovuto alla ricorsione infinita. Se invece vuoi che il comportamento predefinito nella tua implementazione di List, devi evitare di eseguire l'override sort().

    Se un corso principale implementa sort() in modo inappropriato, di solito è possibile eseguire l'override di List.sort() con un'implementazione basata su List.toArray(), Arrays.sort() e ListIterator.set(). Ad esempio:

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    Nella maggior parte dei casi, puoi anche eseguire l'override List.sort() con un che delega a diverse soluzioni predefinite a seconda del livello API. Ad esempio:

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    Se esegui quest'ultima solo perché vuoi avere un sort() disponibile in tutti i livelli dell'API, considera l'assegnazione di un nome univoco, ad esempio sortCompat(), anziché eseguire l'override sort().

  • Collections.sort() ora viene conteggiato come una modifica strutturale Elenca le implementazioni che chiamano sort(). Ad esempio, nelle versioni di la piattaforma prima di Android 8.0 (livello API 26), ArrayList con chiamata a sort() a metà dell'iterazione avrebbe lanciato ConcurrentModificationException se l'ordinamento fosse completo chiamando il numero List.sort(). Collections.sort() non ha generato alcuna eccezione.

    Questa modifica rende il comportamento della piattaforma più coerente: ora si traduce in ConcurrentModificationException.

Comportamento di caricamento della classe

Android 8.0 (livello API 26) verifica che i caricatori di classi non interrompere le ipotesi del runtime quando si caricano nuove classi. Questi controlli vengono eseguita sia se si fa riferimento alla classe in Java (da forName()), Bytecode Dalvik, o JNI. La piattaforma non intercetta le chiamate dirette da Java loadClass(), né verifica i risultati di queste chiamate. Questo comportamento non dovrebbe influire sul funzionamento di una caricatori di classi.

La piattaforma verifica che il descrittore della classe restituito dal caricatore di classi corrisponde al descrittore previsto. Se il descrittore restituito non corrisponde, la piattaforma genera un errore NoClassDefFoundError e la archivia l'eccezione: un messaggio dettagliato che indichi la discrepanza.

La piattaforma controlla anche che i descrittori delle classi richieste siano validi. Questo il controllo rileva chiamate JNI che caricano indirettamente classi come GetFieldID(), passando descrittori non validi a queste classi. Ad esempio, un campo con firma java/lang/String non trovato perché la firma non è valida. dovrebbe essere Ljava/lang/String;.

È diversa da una chiamata JNI a FindClass() dove java/lang/String è un nome completo valido.

Android 8.0 (livello API 26) non supporta il tentativo di definire classi con più caricatori di classi. utilizzando lo stesso oggetto DexFile. Se tenti di farlo, il runtime Android genera un messaggio di errore InternalError errore con il messaggio "Tentativo di registrare il file dex <filename> con più caricatori di classi".

L'API DexFile è ora deprecata e ti consigliamo vivamente di utilizzare uno dei classloader della piattaforma, tra cui PathClassLoader o BaseDexClassLoader.

Nota: puoi creare più caricatori di classi che fanno riferimento lo stesso contenitore di file APK o JAR dal file system. Questa operazione normalmente non comporta comporta un overhead di memoria eccessivo: se i file DEX nel container vengono archiviati invece di compresso, la piattaforma può eseguire un'operazione mmap su di essi anziché estraendole direttamente. Tuttavia, se la piattaforma deve estrarre il file DEX dal container, fare riferimento a un file DEX in questo modo può consumare molta memoria.

In Android, tutti i caricatori di classi sono considerati con funzionalità parallele. Quando si verificano più thread per caricare la stessa classe con la stessa classe loader, il primo thread per completare l'operazione vince e il risultato viene utilizzato dagli altri thread. Questo comportamento si verifica indipendentemente dal fatto che il caricatore di classi ha restituito la stessa classe, una classe diversa o ha generato un'eccezione. La piattaforma ignora automaticamente queste eccezioni.

Attenzione: nelle versioni della piattaforma inferiore ad Android 8.0 (livello API 26), il mancato rispetto di questi presupposti può portare a definire classe più volte, danneggiamento dell'heap dovuto alla confusione delle classi e altri effetti indesiderati.