Modifiche ad Android 6.0

Oltre alle nuove caratteristiche e caratteristiche, Android 6.0 (livello API 23) include una serie di modifiche al sistema e al comportamento delle API. Questo documento mette in evidenza alcune delle modifiche principali che dovresti comprendere e tenere in considerazione nelle tue app.

Se hai già pubblicato un'app per Android, tieni presente che questi cambiamenti nella che la piattaforma interessa la tua app.

Autorizzazioni di runtime

Questa release introduce un nuovo modello di autorizzazioni, in cui gli utenti possono ora gestire direttamente autorizzazioni app in fase di runtime. Questo modello offre agli utenti visibilità e controllo migliori le relative autorizzazioni, il tutto semplificando le procedure di installazione e aggiornamento automatico per gli sviluppatori di app. Gli utenti possono concedere o revocare le autorizzazioni singolarmente per le app installate.

Nelle app che hanno come target Android 6.0 (livello API 23) o versioni successive, assicurati di controllare e richiedere autorizzazioni in fase di runtime. Per determinare se alla tua app è stata concessa un'autorizzazione, chiama il metodo nuovo checkSelfPermission() . Per richiedere un'autorizzazione, chiama il nuovo requestPermissions() . Anche se la tua app non ha come target Android 6.0 (livello API 23), dovresti testarla in il nuovo modello di autorizzazioni.

Per maggiori dettagli sul supporto del nuovo modello di autorizzazioni nella tua app, vedi utilizzare le autorizzazioni di sistema. Per suggerimenti su come valutare l'impatto sulla tua app, consulta le Note sull'utilizzo delle autorizzazioni.

Sospensione e standby delle app

Questa release introduce nuove ottimizzazioni per il risparmio energetico di app e dispositivi inattivi. Questi interessano tutte le app, quindi assicurati di testarle in queste nuove modalità.

  • Sospensione: se un utente scollega un dispositivo e lo lascia fermo con lo schermo spento. per un determinato periodo di tempo, il dispositivo passa in modalità Sospensione, che tenta di mantenere il sistema in stato di sonno. In questa modalità, i dispositivi riprenderanno periodicamente il normale funzionamento per brevi periodi di tempo necessario affinché venga eseguita la sincronizzazione delle app e il sistema possa eseguire eventuali operazioni in sospeso.
  • Standby delle app. Lo standby delle app consente al sistema di determinare se un'app è inattiva. quando l'utente non la utilizza attivamente. Il sistema determina quando l'utente non toccare l'app per un determinato periodo di tempo. Se il dispositivo è scollegato, il sistema disattiva la rete e sospende le sincronizzazioni e i job per le app che ritiene inattive.

Per ulteriori informazioni su queste modifiche per il risparmio energetico, vedi Ottimizzazione per Sospensione e Standby delle app.

Rimozione del client HTTP Apache

La release di Android 6.0 rimuove il supporto per il client HTTP Apache. Se la tua app utilizza questo client ha come target Android 2.3 (livello API 9) o versioni successive, usa la classe HttpURLConnection . Questa API è più efficiente perché riduce l'utilizzo della rete mediante la compressione trasparente e la memorizzazione nella cache delle risposte, e minimizza il consumo di energia. Per continuare a utilizzare le API HTTP di Apache, deve prima dichiarare la seguente dipendenza del tempo di compilazione nel tuo file build.gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android sta abbandonando OpenSSL BoringSSL libreria. Se nella tua app utilizzi l'NDK di Android, non creare link a librerie crittografiche che non fanno parte dell'API NDK, come libcrypto.so e libssl.so. Questi librerie non sono API pubbliche e potrebbero cambiare o interrompersi senza preavviso nelle release e nei dispositivi. Inoltre, potresti esporti a vulnerabilità di sicurezza. Puoi invece modificare per chiamare le API di crittografia Java tramite JNI o per collegarsi in modo statico a una libreria crittografica di tua scelta.

Accesso all'identificatore hardware

Per offrire agli utenti una maggiore protezione dei dati, a partire da questa release, rimuove l'accesso programmatico all'identificatore hardware locale del dispositivo per che utilizzano le API Wi-Fi e Bluetooth. La WifiInfo.getMacAddress() e BluetoothAdapter.getAddress() metodi ora restituisce un valore costante di 02:00:00:00:00:00.

Per accedere agli identificatori hardware dei dispositivi esterni nelle vicinanze tramite ricerche di reti Bluetooth e Wi-Fi, l'app ora deve avere l'ACCESS_FINE_LOCATION o Autorizzazioni ACCESS_COARSE_LOCATION:

Nota: quando un dispositivo con Android 6.0 (livello API 23) avvia una scansione Wi-Fi o Bluetooth in background, l'operazione è visibile ai dispositivi esterni proveniente da un indirizzo MAC casuale.

Notifiche

In questa release viene rimosso il metodo Notification.setLatestEventInfo(). Utilizza la Notification.Builder classe per creare le notifiche. Per aggiornare un più volte la notifica, riutilizza l'istanza Notification.Builder. Chiama il build() metodo per ottenere ha aggiornato Notification istanze.

Il comando adb shell dumpsys notification non stampa più il testo della notifica. Usa il comando adb shell dumpsys notification --noredact per stampare il testo in un oggetto notifica.

Modifiche AudioManager

Impostazione diretta del volume o disattivazione dell'audio di stream specifici tramite AudioManager non è più supportato. Il metodo setStreamSolo() è deprecato. Devi chiamare il metodo requestAudioFocus() . Analogamente, Il metodo setStreamMute() è deprecato; chiama invece il metodo adjustStreamVolume() e passa il valore della direzione ADJUST_MUTE o ADJUST_UNMUTE.

Selezione del testo

Schermata che mostra le nuove funzionalità di selezione del testo all'interno di una barra degli strumenti mobile

Quando gli utenti selezionano del testo nella tua app, ora puoi mostrare azioni di selezione del testo, come Taglia, Copia e Incolla in un barra degli strumenti mobile. L'implementazione dell'interazione dell'utente è simile per la barra delle azioni contestuali, come descritto Attivazione della modalità di azione contestuale per le singole visualizzazioni.

Per implementare una barra degli strumenti mobile per la selezione del testo, apporta le seguenti modifiche nella app:

  1. Nell'oggetto View o Activity, modifica ActionMode chiamate da Da startActionMode(Callback) a startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. Prendi l'implementazione esistente di ActionMode.Callback e ampliala ActionMode.Callback2 in alternativa.
  3. Sostituisci il valore onGetContentRect() per fornire le coordinate dell'oggetto Rect dei contenuti (ad esempio un rettangolo di selezione del testo) nella visualizzazione.
  4. Se il posizionamento del rettangolo non è più valido e questo è l'unico elemento da invalidare, chiama il metodo invalidateContentRect().

Se utilizzi Android Support Library versione 22.2, tieni presente che le barre degli strumenti mobili non sono la compatibilità con le versioni precedenti e appcompat prende il controllo di ActionMode oggetti predefinito. In questo modo, le barre degli strumenti mobili non vengono visualizzate. Per attivare Assistenza ActionMode in AppCompatActivity, chiama getDelegate(), poi chiama setHandleNativeActionModesEnabled() sul reso AppCompatDelegate e imposta l'input su false. Questa chiamata restituisce il controllo degli oggetti ActionMode a il framework. Nei dispositivi con Android 6.0 (livello API 23), che consente al framework di supportare ActionBar o modalità della barra degli strumenti mobile, su dispositivi in esecuzione Android 5.1 (livello API 22) o versioni precedenti, sono disponibili solo le modalità ActionBar supportati.

Modifiche ai preferiti del browser

In questa release non sono più supportati i preferiti globali. La android.provider.Browser.getAllBookmarks() e android.provider.Browser.saveBookmark() sono stati rimossi. Analogamente, i READ_HISTORY_BOOKMARKS e WRITE_HISTORY_BOOKMARKS vengono rimosse. Se la tua app ha come target Android 6.0 (livello API 23) o versioni successive, non accedere preferiti del provider globale oppure utilizza le autorizzazioni Preferiti. L'app deve invece archiviare i dati dei preferiti.

Modifiche all'archivio chiavi Android

In questa versione, Il provider dell'archivio chiavi Android non supporta più annunci dinamici della rete di ricerca. L'ECDSA è ancora supportato.

Le chiavi che non richiedono la crittografia at-rest non verranno più eliminate se la schermata di blocco è sicura viene disattivato o reimpostato (ad esempio dall'utente o da un amministratore del dispositivo). Chiavi che richiedono la crittografia at-rest verrà eliminata durante questi eventi.

Modifiche alle reti e al Wi-Fi

Questa release introduce le seguenti modifiche del comportamento delle API Wi-Fi e di rete.

  • Ora le tue app possono modificare lo stato solo di WifiConfiguration oggetti se hai creato tu questi oggetti. Non hai l'autorizzazione per modificare o eliminare WifiConfiguration oggetti creati dall'utente o da altre app.
  • In precedenza, se un'app costringeva il dispositivo a connettersi a una rete Wi-Fi specifica utilizzando enableNetwork() con Impostazione disableAllOthers=true, il dispositivo si è disconnesso da altre reti, ad esempio rete dati. In questa release, il dispositivo non si disconnette più da altre reti di questo tipo. Se il valore targetSdkVersion della tua app è “20” o inferiore, è bloccato nella selezione Rete Wi-Fi. Se il valore targetSdkVersion della tua app è “21” o superiore, usa le API multinetwork (come openConnection(), bindSocket() e il nuovo bindProcessToNetwork()) per verificare che il relativo traffico di rete venga inviato alla rete selezionata.

Modifiche al servizio Fotocamera

In questa release, il modello per accedere alle risorse condivise nel servizio di videocamera è stato modificato dal precedente modello di accesso "first come, first serve", a un modello di accesso in cui processi sono favoriti. Le modifiche al comportamento del servizio includono:

  • L'accesso alle risorse del sottosistema delle videocamere, tra cui l'apertura e la configurazione di un dispositivo videocamera, è assegnate in base alla "priorità" del processo di richiesta del client. Processi di applicazione con alle attività in primo piano o visibili agli utenti viene generalmente assegnata una priorità più elevata, il che rende la videocamera acquisizione e uso più affidabile.
  • I client della fotocamera attivi per le app con priorità più bassa potrebbero essere "rimossi" quando una priorità più alta tenta di utilizzare la fotocamera. Nell'API Camera deprecata, Questo porta onError() in corso ha richiesto l'eliminazione del cliente. Nell'API Camera2, il risultato onDisconnected() per il cliente rimosso.
  • Sui dispositivi dotati di hardware per fotocamere appropriato, processi di applicazioni separati sono in grado di aprire e utilizzare contemporaneamente videocamere separate. Tuttavia, l'uso multi-processo casi in cui l'accesso simultaneo provoca un peggioramento significativo delle prestazioni o delle capacità dei dispositivi con videocamera aperti, vengono ora rilevati e non consentiti dal servizio videocamera. Questa modifica potrebbero comportare "rimozioni" per i clienti con priorità inferiore anche quando nessun'altra app viene tentare di accedere allo stesso dispositivo videocamera.
  • Se modifichi l'utente corrente, vengono attivati i client della videocamera attivi nelle app di proprietà dell'account utente precedente da rimuovere. L'accesso alla fotocamera è limitato ai profili utente di proprietà dell'utente corrente del dispositivo. In pratica, ciò significa che un account "Ospite", ad esempio, non potrà uscire dal programma. processi che utilizzano il sottosistema della fotocamera quando l'utente è passato a un altro account.

Tempo di esecuzione

Il runtime ART ora implementa correttamente le regole di accesso per il newInstance(). Questo modifica risolve un problema per cui Dalvik controllava in modo errato le regole di accesso nelle versioni precedenti. Se la tua app utilizza newInstance() metodo e tu quando vuoi eseguire l'override dei controlli di accesso, Metodo setAccessible() con l'input impostato su true. Se la tua app utilizza libreria appcompat v7 o il libreria recyclerview v7, devi aggiornare l'app per utilizzarla all'ultima versione di queste librerie. Altrimenti, assicurati che tutte le classi personalizzate a cui si fa riferimento in XML vengono aggiornate in modo che i relativi costruttori delle classi siano accessibili.

In questa release viene aggiornato il comportamento del Linker dinamico. Il Linker dinamico ora comprende le differenza tra il valore soname di una libreria e il relativo percorso () bug pubblico 6670) e la ricerca per soname è ora implementate. App che in precedenza funzionavano con voci DT_NEEDED errate (di solito percorsi assoluti nel file system della macchina di compilazione) potrebbero non riuscire al momento del caricamento.

Il flag dlopen(3) RTLD_LOCAL è ora implementato correttamente. Tieni presente che RTLD_LOCAL è l'impostazione predefinita, quindi le chiamate al numero dlopen(3) che non hanno utilizzato esplicitamente RTLD_LOCAL sarà interessato (a meno che la tua app non utilizzi esplicitamente RTLD_GLOBAL). Con RTLD_LOCAL, i simboli non verranno resi disponibili per le librerie caricate da chiamate successive a dlopen(3) (invece che le voci DT_NEEDED fanno riferimento).

Nelle versioni precedenti di Android, se la tua app ha richiesto al sistema di caricare una libreria condivisa con riposiziona il testo, il sistema ha mostrato un avviso ma ha comunque consentito il caricamento della libreria. A partire da questa release, il sistema rifiuta questa libreria se la versione dell'SDK target dell'app è la 23 o superiore. Per aiutarti a rilevare se il caricamento di una raccolta non è riuscito, la tua app deve registrare il Errore di dlopen(3) e includi il testo della descrizione del problema che dlerror(3) i ritorni di chiamata. Per saperne di più sulla gestione dei ritrasferimenti del testo, consulta questo .

Convalida APK

La piattaforma ora esegue una convalida più rigorosa degli APK. Un APK è considerato danneggiato se un file viene dichiarate nel manifest, ma non presenti nell'APK stesso. L'APK deve essere firmato di nuovo se uno dei vengono rimossi i contenuti.

Connessione USB

Per impostazione predefinita, le connessioni del dispositivo tramite la porta USB sono ora impostate sulla modalità di sola ricarica. Per accedere il dispositivo e i suoi contenuti tramite una connessione USB, gli utenti devono concedere esplicitamente l'autorizzazione e interazioni. Se l'app supporta le interazioni degli utenti con il dispositivo tramite una porta USB, prendi in considerazione tieni presente che l'interazione deve essere esplicitamente abilitata.

Modifiche ad Android for Work

Questa release include le seguenti modifiche del comportamento per Android for Work:

  • Contatti di lavoro in contesti personali. Google Dialer Il Registro chiamate ora mostra i contatti di lavoro quando l'utente visualizza le chiamate passate. Impostazione setCrossProfileCallerIdDisabled() In true i contatti del profilo di lavoro vengono nascosti nel Registro chiamate di Telefono Google. I contatti di lavoro possono essere visualizzato insieme ai contatti personali ai dispositivi tramite Bluetooth solo se hai impostato setBluetoothContactSharingDisabled() su false. Per impostazione predefinita, è impostato su true.
  • Rimozione della configurazione Wi-Fi:le configurazioni Wi-Fi aggiunte da un proprietario del profilo. (ad esempio, tramite le chiamate al addNetwork()) vengono ora rimossi se il profilo di lavoro viene eliminato.
  • Blocco della configurazione Wi-Fi:qualsiasi configurazione Wi-Fi creata da un proprietario di dispositivo attivo non può più essere modificato o eliminato dall'utente se WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN è diverso da zero. L'utente può comunque creare e modificare le proprie configurazioni Wi-Fi. Dispositivo attivo I proprietari hanno il privilegio di modificare o rimuovere qualsiasi configurazione Wi-Fi, inclusi quelli non creati da loro.
  • Scarica il controller dei criteri dei dispositivi tramite l'aggiunta di Account Google:quando un account Google viene aggiunto a un dispositivo un account che richiede la gestione tramite un'app controller dei criteri dei dispositivi (DPC) al di fuori di un contesto gestito, il flusso di aggiunta dell'account ora chiede all'utente di installare il WPC appropriato. Questo comportamento vale anche per gli account aggiunti tramite Impostazioni > Account e nella configurazione iniziale del dispositivo.
  • Modifiche ai comportamenti specifici dell'API DevicePolicyManager:
    • Chiamata a setCameraDisabled() influisce sulla fotocamera solo per l'utente chiamante; la chiamata dal profilo gestito incide sulle app della fotocamera eseguite sull'utente principale.
    • Inoltre, setKeyguardDisabledFeatures() è ora disponibile sia per i proprietari dei profili che per i proprietari dei dispositivi.
    • Il proprietario di un profilo può impostare le seguenti limitazioni relative alla protezione della tastiera:
    • I metodi DevicePolicyManager.createAndInitializeUser() e DevicePolicyManager.createUser() sono stati ritirati.
    • setScreenCaptureDisabled() ora blocca anche la struttura di assistenza quando un'app dell'utente specificato è in primo piano.
    • EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM ora il valore predefinito è SHA-256. L'algoritmo SHA-1 è ancora supportato per la compatibilità con le versioni precedenti, ma verrà rimosso in futuro. EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM ora accetta solo SHA-256.
    • Le API di inizializzazione dei dispositivi esistenti in Android 6.0 (livello API 23) vengono ora rimosse.
    • EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS rimosso, quindi urto NFC Il provisioning non può sbloccare in modo programmatico un dispositivo protetto sottoposto a ripristino dei dati di fabbrica.
    • Ora puoi usare EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE per trasferire i dati all'app del proprietario del dispositivo durante il provisioning NFC del dispositivo gestito.
    • Le API Android for Work sono ottimizzate per le autorizzazioni di runtime M, inclusi i profili di lavoro, strato di assistenza assistita e altri. Le nuove API delle autorizzazioni DevicePolicyManager non lo fanno influisce sulle app pre-M.
    • Quando gli utenti escono dalla parte sincrona del flusso di configurazione, iniziato tramite un ACTION_PROVISION_MANAGED_PROFILE o Intent ACTION_PROVISION_MANAGED_DEVICE, il sistema ora restituisce un codice risultato RESULT_CANCELED.
  • Modifiche ad altre API:
      .
    • Utilizzo dei dati: la classe android.app.usage.NetworkUsageStats è stata rinominata NetworkStats.
  • Modifiche alle impostazioni generali: