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
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:
- Nell'oggetto
View
oActivity
, modificaActionMode
chiamate da DastartActionMode(Callback)
astartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - Prendi l'implementazione esistente di
ActionMode.Callback
e amplialaActionMode.Callback2
in alternativa. - Sostituisci il valore
onGetContentRect()
per fornire le coordinate dell'oggettoRect
dei contenuti (ad esempio un rettangolo di selezione del testo) nella visualizzazione. - 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 eliminareWifiConfiguration
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 ImpostazionedisableAllOthers=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 valoretargetSdkVersion
della tua app è“20”
o inferiore, è bloccato nella selezione Rete Wi-Fi. Se il valoretargetSdkVersion
della tua app è“21”
o superiore, usa le API multinetwork (comeopenConnection()
,bindSocket()
e il nuovobindProcessToNetwork()
) 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 portaonError()
in corso ha richiesto l'eliminazione del cliente. Nell'APICamera2
, il risultatoonDisconnected()
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()
Intrue
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 impostatosetBluetoothContactSharingDisabled()
sufalse
. Per impostazione predefinita, è impostato sutrue
. - 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:
KEYGUARD_DISABLE_TRUST_AGENTS
eKEYGUARD_DISABLE_FINGERPRINT
, che interessano le impostazioni del blocco tastiera per l'utente principale del profilo.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, che interessa solo le notifiche generate dalle applicazioni nel profilo gestito.
- I metodi
DevicePolicyManager.createAndInitializeUser()
eDevicePolicyManager.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 IntentACTION_PROVISION_MANAGED_DEVICE
, il sistema ora restituisce un codice risultatoRESULT_CANCELED
.
- Chiamata a
- Modifiche ad altre API:
- .
- Utilizzo dei dati: la classe
android.app.usage.NetworkUsageStats
è stata rinominataNetworkStats
.
- Utilizzo dei dati: la classe
- Modifiche alle impostazioni generali:
- .
- Queste impostazioni non possono più essere configurate tramite
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Ora è possibile configurare queste impostazioni globali tramite
setGlobalSettings()
:
- Queste impostazioni non possono più essere configurate tramite