Android 7.0 viene eseguito in modalità Avvio diretto sicura quando il dispositivo è stato acceso, ma l'utente non l'ha sbloccato. Per supportare questa funzionalità, il sistema fornisce due posizioni di archiviazione per i dati:
- Spazio di archiviazione criptato con credenziali, che è la posizione di archiviazione predefinita e disponibile solo dopo che l'utente ha sbloccato il dispositivo.
- Spazio di archiviazione criptato del dispositivo, che è una posizione di archiviazione disponibile sia in modalità Avvio diretto sia dopo che l'utente ha sbloccato il dispositivo.
Per impostazione predefinita, le app non vengono eseguite in modalità Avvio diretto. Se la tua app deve eseguire un'azione in modalità Avvio diretto, puoi registrare i componenti dell'app da eseguire in questa modalità. Ecco alcuni casi d'uso comuni per le app che devono essere eseguite in modalità Avvio diretto:
- App con notifiche pianificate, ad esempio app sveglia.
- App che forniscono notifiche utente importanti, ad esempio app per SMS.
- App che forniscono servizi di accessibilità, ad esempio TalkBack.
Se la tua app deve accedere ai dati durante l'esecuzione in modalità Avvio diretto, utilizza lo spazio di archiviazione criptato del dispositivo. Lo spazio di archiviazione criptato del dispositivo contiene dati criptati con una chiave disponibile solo dopo che un dispositivo ha eseguito un avvio verificato.
Per i dati che devono essere criptati con una chiave associata alle credenziali utente, ad esempio un PIN o una password, utilizza lo spazio di archiviazione criptato con credenziali. Lo spazio di archiviazione criptato con credenziali è disponibile dopo che l'utente ha sbloccato correttamente il dispositivo e fino a quando non lo riavvia. Se l'utente attiva la schermata di blocco dopo aver sbloccato il dispositivo, lo spazio di archiviazione criptato con credenziali rimane disponibile.
Richiedere l'accesso per l'esecuzione durante l'avvio diretto
Le app devono registrare i propri componenti con il sistema prima di poter essere eseguite in modalità Avvio diretto o accedere allo spazio di archiviazione criptato del dispositivo. Le app si registrano con il sistema contrassegnando i componenti come compatibili con la crittografia. Per contrassegnare il componente come compatibile con la crittografia, imposta l'attributo android:directBootAware su true nel manifest.
I componenti compatibili con la crittografia possono registrarsi per ricevere un annuncio ACTION_LOCKED_BOOT_COMPLETED dal sistema quando il dispositivo è stato riavviato. A questo punto, lo spazio di archiviazione criptato del dispositivo è disponibile e il componente può eseguire le attività che devono essere eseguite in modalità Avvio diretto, ad esempio attivare una sveglia pianificata.
Il seguente snippet di codice è un esempio di come registrare un BroadcastReceiver come compatibile con la crittografia e aggiungere un filtro per intent per ACTION_LOCKED_BOOT_COMPLETED nel manifest dell'app:
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
Una volta che l'utente ha sbloccato il dispositivo, tutti i componenti possono accedere sia allo spazio di archiviazione criptato del dispositivo sia allo spazio di archiviazione criptato con credenziali.
Accedere allo spazio di archiviazione criptato del dispositivo
Per accedere allo spazio di archiviazione criptato del dispositivo, crea una seconda
Context istanza chiamando
Context.createDeviceProtectedStorageContext(). Tutte le chiamate API di archiviazione effettuate utilizzando questo contesto accedono allo spazio di archiviazione criptato del dispositivo. L'esempio seguente accede allo spazio di archiviazione criptato del dispositivo e apre un file di dati dell'app esistente:
Kotlin
val directBootContext: Context = appContext.createDeviceProtectedStorageContext() // Access appDataFilename that lives in device encrypted storage val inStream: InputStream = directBootContext.openFileInput(appDataFilename) // Use inStream to read content...
Java
Context directBootContext = appContext.createDeviceProtectedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
Utilizza lo spazio di archiviazione criptato del dispositivo solo per le informazioni a cui devi poter accedere in modalità Avvio diretto. Non utilizzare lo spazio di archiviazione criptato del dispositivo come archivio criptato per uso generico. Per le informazioni private dell'utente o i dati criptati che non sono necessari in modalità Avvio diretto, utilizza lo spazio di archiviazione criptato con credenziali.
Ricevere una notifica di sblocco dell'utente
Quando l'utente sblocca il dispositivo dopo il riavvio, la tua app può passare all'accesso allo spazio di archiviazione criptato con credenziali e utilizzare i normali servizi di sistema che dipendono dalle credenziali utente.
Per ricevere una notifica quando l'utente sblocca il dispositivo dopo un riavvio, registra un BroadcastReceiver da un componente in esecuzione per ascoltare i messaggi di notifica di sblocco. Quando l'utente sblocca il dispositivo dopo l'avvio:
- Se la tua app ha processi in primo piano che richiedono una notifica immediata, ascolta il messaggio
ACTION_USER_UNLOCKED. - Se la tua app utilizza solo processi in background che possono agire su una notifica ritardata, ascolta il messaggio
ACTION_BOOT_COMPLETED.
Se l'utente ha sbloccato il dispositivo, puoi scoprirlo chiamando UserManager.isUserUnlocked().
Eseguire la migrazione dei dati esistenti
Se un utente aggiorna il proprio dispositivo per utilizzare la modalità Avvio diretto, potresti avere dati esistenti di cui è necessario eseguire la migrazione allo spazio di archiviazione criptato del dispositivo. Utilizza Context.moveSharedPreferencesFrom() e Context.moveDatabaseFrom(), con il contesto di destinazione come chiamante del metodo e il contesto di origine come argomento, per eseguire la migrazione dei dati delle preferenze e del database tra lo spazio di archiviazione criptato con credenziali e lo spazio di archiviazione criptato del dispositivo.
Non eseguire la migrazione delle informazioni private dell'utente, ad esempio password o token di autorizzazione, dallo spazio di archiviazione criptato con credenziali allo spazio di archiviazione criptato del dispositivo. Utilizza il tuo miglior giudizio quando decidi quali altri dati eseguire la migrazione allo spazio di archiviazione criptato del dispositivo. In alcuni scenari, potrebbe essere necessario gestire set di dati separati nei due archivi criptati.
Testare l'app compatibile con la crittografia
Testa l'app compatibile con la crittografia con la modalità Avvio diretto attivata.
La maggior parte dei dispositivi che eseguono versioni recenti di Android attiva la modalità Avvio diretto ogni volta che è stata impostata una credenziale della schermata di blocco (PIN, sequenza o password). In particolare, questo è il caso di tutti i dispositivi che utilizzano la crittografia basata su file. Per verificare se un dispositivo utilizza la crittografia basata su file, esegui il seguente comando della shell:
adb shell getprop ro.crypto.type
Se l'output è file, significa che la crittografia basata su file è attivata sul dispositivo.
Sui dispositivi che non utilizzano la crittografia basata su file per impostazione predefinita, potrebbero essere disponibili altre opzioni per testare la modalità Avvio diretto:
-
Alcuni dispositivi che utilizzano la crittografia completa del disco (
ro.crypto.type=block) ed eseguono Android 7.0 fino ad Android 12 possono essere convertiti alla crittografia basata su file. Puoi farlo in due modi:- Sul dispositivo, attiva le Opzioni sviluppatore , se non l'hai già fatto, andando a Impostazioni > Informazioni sul telefono e toccando Numero build sette volte. Quindi vai a Impostazioni > Opzioni sviluppatore e seleziona Converti in crittografia file.
- In alternativa, esegui i seguenti comandi della shell:
adb reboot-bootloaderfastboot --wipe-and-use-fbe
Avviso: entrambi i metodi di conversione alla crittografia basata su file cancellano tutti i dati utente sul dispositivo.
-
I dispositivi che eseguono Android 13 o versioni precedenti supportano una modalità Avvio diretto "emulata" che utilizza le autorizzazioni dei file per simulare gli effetti dei file criptati bloccati e sbloccati. Utilizza la modalità emulata solo durante lo sviluppo, in quanto può causare la perdita di dati. Per attivare la modalità Avvio diretto emulata, imposta una sequenza di blocco sul dispositivo, scegli "No, grazie" se ti viene chiesto di visualizzare una schermata di avvio sicuro quando imposti una sequenza di blocco, quindi esegui il seguente comando della shell:
adb shell sm set-emulate-fbe true
Per disattivare la modalità Avvio diretto emulata, esegui il seguente comando della shell command:
adb shell sm set-emulate-fbe false
L'esecuzione di uno di questi comandi comporta il riavvio del dispositivo.
Controllare lo stato di crittografia delle norme relative ai dispositivi
Le app di amministrazione dei dispositivi possono utilizzare DevicePolicyManager.getStorageEncryptionStatus() per controllare lo stato di crittografia attuale del dispositivo.
Se la tua app ha come target un livello API inferiore ad Android 7.0 (API 24), getStorageEncryptionStatus() restituisce ENCRYPTION_STATUS_ACTIVE se il dispositivo utilizza la crittografia completa del disco o la crittografia basata su file con Avvio diretto. In entrambi i casi, i dati vengono sempre archiviati criptati inattivi.
Se la tua app ha come target Android 7.0 (API 24) o versioni successive, getStorageEncryptionStatus() restituisce ENCRYPTION_STATUS_ACTIVE se il dispositivo utilizza la crittografia completa del disco. Restituisce ENCRYPTION_STATUS_ACTIVE_PER_USER se il dispositivo utilizza la crittografia basata su file con Avvio diretto.
Se crei un'app di amministrazione dei dispositivi
che ha come target Android 7.0, assicurati di controllare sia
ENCRYPTION_STATUS_ACTIVE sia
ENCRYPTION_STATUS_ACTIVE_PER_USER per determinare se il dispositivo è
criptato.
Altri esempi di codice
L'esempio DirectBoot illustra ulteriormente l'utilizzo delle API trattate in questa pagina.