Oltre alle nuove funzionalità, 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 devi comprendere e tenere conto nelle tue app.
Se hai già pubblicato un'app per Android, tieni presente che questi cambiamenti nella piattaforma influiscono sulla tua app.
Autorizzazioni di runtime
Questa release introduce un nuovo modello di autorizzazioni, in cui gli utenti ora possono gestire direttamente le autorizzazioni delle app in fase di runtime. Questo modello offre agli utenti una maggiore visibilità e controllo sulle autorizzazioni, semplificando al contempo 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 le autorizzazioni in fase di esecuzione. Per determinare se alla tua app è stata concessa un'autorizzazione, chiama il nuovo metodo checkSelfPermission()
. Per richiedere un'autorizzazione, chiama il nuovo metodorequestPermissions()
. Anche se la tua app non ha come target Android 6.0 (livello API 23), devi testarla nel nuovo modello di autorizzazioni.
Per informazioni dettagliate sul supporto del nuovo modello di autorizzazioni nella tua app, consulta 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 per app e dispositivi inattivi. Queste funzionalità 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 sospensione. In questa modalità, i dispositivi riprenderanno periodicamente le normali operazioni per brevi periodi di tempo, affinché sia possibile eseguire 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 sta utilizzando attivamente. Il sistema determina quando l'utente non tocca l'app per un determinato periodo di tempo. Se il dispositivo è scollegato, il sistema disattiva l'accesso alla rete e sospende le sincronizzazioni e i job per le app che ritiene inattive.
Per scoprire di più su queste modifiche per il risparmio energetico, vedi Ottimizzazione per sospensione e standby delle app.
Rimozione di Apache HTTP Client
La release di Android 6.0 rimuove il supporto per il client HTTP Apache. Se la tua app utilizza questo client e ha come target Android 2.3 (livello API 9) o versioni successive, utilizza la classe HttpURLConnection
. Questa API è più efficiente perché riduce l'utilizzo della rete tramite compressione trasparente
e memorizzazione nella cache della risposta e riduce al minimo il consumo energetico. Per continuare a utilizzare le API HTTP di Apache,
devi prima dichiarare la seguente dipendenza di compilazione nel file build.gradle
:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android sta abbandonando OpenSSL alla libreria BoringSSL. Se nella tua app utilizzi l'NDK di Android, non collegare librerie crittografiche che non fanno parte dell'API NDK, come libcrypto.so
e libssl.so
. Queste librerie non sono API pubbliche e potrebbero cambiare o non essere più disponibili senza preavviso nelle release e sui dispositivi.
Inoltre, potresti esporre il tuo account a vulnerabilità di sicurezza. Modifica invece il codice nativo per chiamare le API di crittografia Java tramite JNI o per collegarti in modo statico a una libreria di crittografia di tua scelta.
Accesso all'identificatore hardware
Per offrire agli utenti una maggiore protezione dei dati, a partire da questa release Android
rimuove l'accesso programmatico all'identificatore hardware locale del dispositivo
per le app che utilizzano le API Wi-Fi e Bluetooth. I metodi
WifiInfo.getMacAddress()
e
BluetoothAdapter.getAddress()
ora restituiscono un valore costante di 02:00:00:00:00:00
.
Per accedere agli identificatori hardware dei dispositivi esterni nelle vicinanze tramite ricerche relative a Bluetooth e Wi-Fi,
l'app deve ora disporre delle autorizzazioni ACCESS_FINE_LOCATION
o
ACCESS_COARSE_LOCATION
:
Nota: quando un dispositivo con Android 6.0 (livello API 23) avvia una ricerca Wi-Fi o Bluetooth in background, l'operazione è visibile ai dispositivi esterni come proveniente da un indirizzo MAC casuale.
Notifiche
In questa release viene rimosso il metodo Notification.setLatestEventInfo()
. Utilizza la
classe Notification.Builder
per creare le notifiche. Per aggiornare
più volte una notifica, riutilizza l'istanza Notification.Builder
. Chiama il metodo build()
per ottenere le istanze Notification
aggiornate.
Il comando adb shell dumpsys notification
non stampa più il testo della notifica.
Utilizza invece il comando adb shell dumpsys notification --noredact
per stampare il testo
in un oggetto di notifica.
Modifiche AudioManager
L'impostazione diretta del volume o la disattivazione dell'audio di stream specifici tramite la classe AudioManager
non è più supportata. Il metodo setStreamSolo()
è deprecato e devi chiamare il metodo
requestAudioFocus()
. Allo stesso modo, il metodo setStreamMute()
è deprecato; chiama invece il metodo adjustStreamVolume()
e passa il valore di direzione ADJUST_MUTE
o ADJUST_UNMUTE
.
Selezione del testo
Quando gli utenti selezionano testo nella tua app, ora puoi mostrare azioni di selezione del testo come Taglia, Copia e Incolla in una barra degli strumenti mobile. L'implementazione dell'interazione utente è simile a quella della barra di azioni contestuali, come descritto in Attivare la modalità di azioni contestuali per le singole visualizzazioni.
Per implementare una barra degli strumenti mobile per la selezione del testo, apporta le seguenti modifiche nelle app esistenti:
- Nell'oggetto
View
oActivity
, modifica le chiamateActionMode
dastartActionMode(Callback)
astartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - Prendi l'implementazione esistente di
ActionMode.Callback
e estendila aActionMode.Callback2
. - Sostituisci il metodo
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 la versione 22.2 della
Libreria di supporto Android, tieni presente che le barre degli strumenti mobili non sono
compatibili con le versioni precedenti e che appcompat assume il controllo degli oggetti ActionMode
per
impostazione predefinita. In questo modo, le barre degli strumenti mobili non vengono visualizzate. Per attivare il supporto di ActionMode
in un AppCompatActivity
, chiama getDelegate()
, quindi chiama setHandleNativeActionModesEnabled()
sull'oggetto AppCompatDelegate
restituito e imposta il parametro di input su false
. Questa chiamata restituisce il controllo degli oggetti ActionMode
al framework. Nei dispositivi con Android 6.0 (livello API 23), il framework supporta le modalità ActionBar
o della barra degli strumenti mobile, mentre sui dispositivi con Android 5.1 (livello API 22) o versioni precedenti sono supportate solo le modalità ActionBar
.
Modifiche ai preferiti del browser
In questa release non sono più supportati i preferiti globali. I metodi
android.provider.Browser.getAllBookmarks()
e android.provider.Browser.saveBookmark()
sono ora rimossi. Allo stesso modo, vengono rimosse le autorizzazioni READ_HISTORY_BOOKMARKS
e WRITE_HISTORY_BOOKMARKS
. Se la tua app ha come target Android 6.0 (livello API 23) o versioni successive, non accedere ai preferiti del fornitore globale né utilizzare le autorizzazioni per i preferiti. L'app dovrebbe invece archiviare
i dati dei preferiti internamente.
Modifiche all'archivio chiavi Android
Con questa release, il provider Android Keystore non supporta più la crittografia DSA. L'ECDSA è ancora supportato.
Le chiavi che non richiedono la crittografia a riposo non verranno più eliminate quando la schermata di blocco sicura viene disattivata o reimpostata (ad esempio dall'utente o da un amministratore dispositivo). Le chiavi che richiedono la crittografia a riposo verranno eliminate durante questi eventi.
Modifiche al Wi-Fi e alla rete
Questa release introduce le seguenti modifiche al comportamento delle API Wi-Fi e di rete.
- Ora le app possono modificare lo stato degli oggetti
WifiConfiguration
solo se li hai creati. Non puoi modificare o eliminare gli oggettiWifiConfiguration
creati dall'utente o da altre app. -
In precedenza, se un'app forzava il dispositivo a connettersi a una rete Wi-Fi specifica utilizzando
enableNetwork()
con l'impostazionedisableAllOthers=true
, il dispositivo si disconnetteva da altre reti come la 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, l'app viene bloccata sulla rete Wi-Fi selezionata. Se il valoretargetSdkVersion
della tua app è“21”
o superiore, utilizza le API multirete (comeopenConnection()
,bindSocket()
e il nuovo metodobindProcessToNetwork()
) per assicurarti che il relativo traffico di rete venga inviato sulla rete selezionata.
Modifiche al servizio Fotocamera
In questa release, il modello di accesso alle risorse condivise nel servizio della videocamera è stato modificato dal precedente modello di accesso "chi prima arriva, prima è servito" a un modello di accesso in cui vengono privilegiate le procedure con priorità elevata. Le modifiche al comportamento del servizio includono:
- L'accesso alle risorse del sottosistema della videocamera, inclusa l'apertura e la configurazione di un dispositivo della videocamera, viene assegnato in base alla "priorità" del processo dell'applicazione client. In genere, alle procedure di applicazione con attività visibili all'utente o in primo piano viene assegnata una priorità più elevata, rendendo più affidabili l'acquisizione e l'utilizzo delle risorse della videocamera.
- I client attivi della fotocamera per le app con priorità più bassa potrebbero essere "rimossi" quando un'applicazione con priorità più alta tenta di utilizzare la fotocamera. Nell'API
Camera
deprecata, questo fa sì cheonError()
venga chiamato per il client rimosso. Nell'APICamera2
, viene richiestoonDisconnected()
per il client rimosso. - Sui dispositivi con hardware della fotocamera appropriato, i processi di applicazione separati sono in grado di aprire e utilizzare contemporaneamente dispositivi di fotocamere separati in modo indipendente. Tuttavia, i casi di utilizzo multi-processo, in cui l'accesso simultaneo causa un degrado significativo delle prestazioni o delle funzionalità di uno dei dispositivi con videocamera aperti, ora vengono rilevati e non sono consentiti dal servizio della videocamera. Questa modifica potrebbe comportare "rimozioni" per i client con priorità inferiore anche quando nessun'altra app tenta direttamente di accedere allo stesso dispositivo con videocamera.
- La modifica dell'utente corrente comporta l'espulsione dei client della videocamera attivi nelle app di proprietà dell'account utente precedente. 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à lasciare in esecuzione processi che utilizzano il sottosistema della videocamera quando l'utente è passato a un altro account.
Tempo di esecuzione
Il runtime ART ora implementa correttamente le regole di accesso per il metodo
newInstance()
. Questa
modifica risolve un problema per cui Dalvik controllava erroneamente le regole di accesso nelle versioni precedenti.
Se la tua app utilizza il metodo
newInstance()
e vuoi eseguire l'override dei controlli di accesso, chiama il metodo
setAccessible()
con il parametro di input impostato su true
. Se l'app utilizza la
libreria appcompat v7 o la
libreria Recyclerview v7,
devi aggiornare l'app in modo che venga utilizzata alle versioni più recenti di queste librerie. In caso contrario, assicurati che tutte le classi personalizzate a cui viene fatto riferimento in XML vengano 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 la
differenza tra il valore soname
di una libreria e il relativo percorso
(
bug pubblico 6670) e la ricerca per soname
è ora
implementata. Le app che funzionavano in precedenza e che hanno voci DT_NEEDED
errate
(di solito percorsi assoluti nel file system della macchina di compilazione) potrebbero non riuscire quando vengono caricate.
Il flag dlopen(3) RTLD_LOCAL
è ora implementato correttamente. Tieni presente che
RTLD_LOCAL
è il valore predefinito, pertanto le chiamate a dlopen(3)
che non hanno utilizzato esplicitamente
RTLD_LOCAL
saranno interessate (a meno che la tua app non abbia utilizzato esplicitamente RTLD_GLOBAL
). Con
RTLD_LOCAL
, i simboli non verranno resi disponibili alle librerie caricate da chiamate successive a
dlopen(3)
(a differenza del fatto che vengano richiamati dalle voci DT_NEEDED
).
Nelle versioni precedenti di Android, se la tua app richiedeva al sistema di caricare una libreria condivisa con rilocuazioni di testo, il sistema mostrava un avviso, ma consentiva comunque il caricamento della libreria.
A partire da questa release, il sistema rifiuta questa libreria se la versione dell'SDK di destinazione della tua app è 23 o successiva. Per aiutarti a rilevare se il caricamento di una libreria non è riuscito, la tua app deve registrare l'errore dlopen(3)
e includere il testo descrittivo del problema restituito dalla chiamata dlerror(3)
. Per scoprire di più sulla gestione dei trasferimenti di testo, consulta questa
guida.
Convalida APK
La piattaforma ora esegue una convalida più rigorosa degli APK. Un APK è considerato danneggiato se un file è dichiarato nel file manifest, ma non è presente nell'APK stesso. Un APK deve essere firmato di nuovo se uno dei contenuti viene rimosso.
Connessione USB
Le connessioni dei dispositivi tramite la porta USB sono ora impostate sulla modalità solo ricarica per impostazione predefinita. Per accedere al dispositivo e ai suoi contenuti tramite una connessione USB, gli utenti devono concedere esplicitamente l'autorizzazione per queste interazioni. Se l'app supporta le interazioni degli utenti con il dispositivo tramite una porta USB, 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. Il registro chiamate di Google Dialer ora mostra i contatti di lavoro quando l'utente visualizza le chiamate passate.
Se imposti
setCrossProfileCallerIdDisabled()
sutrue
, i contatti del profilo di lavoro vengono nascosti nel registro chiamate di Google Telefono. I contatti di lavoro possono essere visualizzati insieme ai contatti personali sui dispositivi tramite Bluetooth solo se impostisetBluetoothContactSharingDisabled()
sufalse
. Per impostazione predefinita, è impostato sutrue
. - Rimozione della configurazione Wi-Fi: le configurazioni Wi-Fi aggiunte da un proprietario del profilo
(ad esempio, tramite chiamate al metodo
addNetwork()
) vengono ora rimosse se il profilo di lavoro viene eliminato. - Blocco della configurazione Wi-Fi: le configurazioni Wi-Fi create da
un proprietario del dispositivo attivo non possono più essere modificate o eliminate dall'utente se
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
è diverso da zero. L'utente può comunque creare e modificare le proprie configurazioni Wi-Fi. I proprietari di dispositivi attivi hanno il privilegio di modificare o rimuovere le configurazioni Wi-Fi, incluse quelle non create da loro. - Scarica il controller dei criteri dei dispositivi tramite l'aggiunta di Account Google:quando un Account Google che richiede la gestione tramite un'app controller dei criteri dei dispositivi (DPC) viene aggiunto a un dispositivo al di fuori di un contesto gestito, il flusso di aggiunta dell'account ora chiede all'utente di installare il WPC appropriato. Questo comportamento si applica anche agli account aggiunti tramite Impostazioni > Account e nella configurazione guidata iniziale del dispositivo.
- Modifiche ai comportamenti specifici dell'API
DevicePolicyManager
:- L'uso del metodo
setCameraDisabled()
incide solo sulla videocamera dell'utente che effettua la chiamata. Se lo chiami dal profilo gestito, le app della videocamera in esecuzione sull'utente principale non sono interessate. - Inoltre, il metodo
setKeyguardDisabledFeatures()
è ora disponibile per i proprietari dei profili e dei proprietari dei dispositivi. - Un proprietario del profilo può impostare le seguenti limitazioni relative alla protezione della chiave:
KEYGUARD_DISABLE_TRUST_AGENTS
eKEYGUARD_DISABLE_FINGERPRINT
, che influiscono sulle 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. - Il metodo
setScreenCaptureDisabled()
ora blocca anche la struttura di assistenza quando un'app dell'utente specificato è in primo piano. - Il valore predefinito di
EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
ora è SHA-256. 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
è stato rimosso in modo che il provisioning bumper NFC non possa sbloccare in modo programmatico un dispositivo protetto sottoposto a ripristino dei dati di fabbrica.- Ora puoi utilizzare l'opzione aggiuntiva
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 di M, inclusi i profili di lavoro,
la funzionalità Assistente e altre. Le nuove API di autorizzazione
DevicePolicyManager
non influiscono sulle app pre-M. - Quando gli utenti escono dalla parte sincrona del flusso di configurazione avviata tramite un intent
ACTION_PROVISION_MANAGED_PROFILE
oACTION_PROVISION_MANAGED_DEVICE
, il sistema ora restituisce un codice risultatoRESULT_CANCELED
.
- L'uso del metodo
- Modifiche ad altre API:
- Utilizzo dei dati: la classe
android.app.usage.NetworkUsageStats
è stata rinominataNetworkStats
.
- Utilizzo dei dati: la classe
- Modifiche alle impostazioni globali:
- Queste impostazioni non possono più essere impostate tramite
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Ora queste impostazioni globali possono essere impostate tramite
setGlobalSettings()
:
- Queste impostazioni non possono più essere impostate tramite