
Android si è evoluto nel tempo per supportare un'ampia varietà di tipi e funzionalità di dispositivi di archiviazione. Tutte le versioni dei dispositivi Android supportano lo storage tradizionale , che include lo storage portatile ed emulato. L'archiviazione portatile può essere fornita da supporti fisici, come una scheda SD o USB, ovvero per il trasferimento temporaneo di dati/archiviazione di file. Il supporto fisico può rimanere con il dispositivo per un periodo di tempo prolungato, ma non è legato al dispositivo e può essere rimosso. Le schede SD sono disponibili come memoria portatile da Android 1.0; Android 6.0 ha aggiunto il supporto USB. L'archiviazione emulata viene fornita esponendo una parte della memoria interna attraverso un livello di emulazione ed è disponibile da Android 3.0.
A partire da Android 6.0, Android supporta l' archiviazione adottabile , fornita da un supporto fisico, come una scheda SD o USB, crittografata e formattata per comportarsi come una memoria interna. L'archiviazione adottabile può archiviare tutti i tipi di dati dell'applicazione.
Permessi
L'accesso alla memoria esterna è protetto da varie autorizzazioni Android. A partire da Android 1.0, l'accesso in scrittura è protetto con l'autorizzazione WRITE_EXTERNAL_STORAGE
. A partire da Android 4.1, l'accesso in lettura è protetto con l'autorizzazione READ_EXTERNAL_STORAGE
.
A partire da Android 4.4, il proprietario, il gruppo e le modalità dei file sui dispositivi di archiviazione esterni vengono ora sintetizzati in base alla struttura delle directory. Ciò consente alle app di gestire le directory specifiche del pacchetto su una memoria esterna senza richiedere l'autorizzazione ampia WRITE_EXTERNAL_STORAGE
. Ad esempio, l'app con il nome del pacchetto com.example.foo
ora può accedere liberamente ad Android/data/com.example.foo/
su dispositivi di archiviazione esterni senza autorizzazioni. Queste autorizzazioni sintetizzate vengono ottenute avvolgendo i dispositivi di archiviazione grezzi in un demone FUSE.
A partire da Android 10, le app che hanno come target Android 9 e riducono l'impostazione predefinita allo spazio di archiviazione legacy e possono attivare lo spazio di archiviazione isolato. Le app che hanno come target Android 10 e per impostazione predefinita lo spazio di archiviazione isolato possono disattivarlo temporaneamente . Usa l'attributo manifest requestLegacyExternalStorage
, che controlla il modello di archiviazione, per modificare lo stato predefinito.
Poiché entrambe le autorizzazioni READ_EXTERNAL_STORAGE
e WRITE_EXTERNAL_STORAGE
sono limitate in modo graduale, se il programma di installazione non ha inserito l'app nella whitelist, l'autorizzazione controlla l'accesso solo alle raccolte uditive e visive, senza accesso alla scheda SD. Ciò si applica anche se l'app richiede l'archiviazione legacy. Per ulteriori informazioni sulle restrizioni rigide e sulle restrizioni flessibili, vedere Restrizioni rigide e flessibili in Android 10 .
Se il programma di installazione ha autorizzato l'autorizzazione, un'app in esecuzione in modalità legacy ottiene il comportamento dell'autorizzazione non isolata. L'autorizzazione controlla l'accesso alla scheda SD e le raccolte sonore e visive. Ciò accade quando l'app ha come target Android 9 o versioni precedenti e non attiva l'archiviazione isolata, oppure ha come target Android 10 e si disattiva.
Lo stato della whitelist può essere specificato solo al momento dell'installazione e non può essere modificato fino a quando l'app non è stata installata.
Per ulteriori informazioni sull'impostazione dell'autorizzazione READ_EXTERNAL_STORAGE
, vedere setWhitelistedRestrictedPermissions()
nella classe PackageInstaller.SessionParams .
Autorizzazioni di runtime
Android 6.0 introduce un nuovo modello di autorizzazioni di runtime in cui le app richiedono funzionalità quando necessario in fase di runtime. Poiché il nuovo modello include le autorizzazioni READ/WRITE_EXTERNAL_STORAGE
, la piattaforma deve concedere dinamicamente l'accesso allo storage senza uccidere o riavviare le app già in esecuzione. Lo fa mantenendo tre viste distinte di tutti i dispositivi di archiviazione montati:
-
/mnt/runtime/default
viene mostrato alle app senza autorizzazioni di archiviazione speciali e allo spazio dei nomi radice in cuiadbd
e altri componenti di sistema. -
/mnt/runtime/read
viene mostrato alle app conREAD_EXTERNAL_STORAGE
(impostaLEGACY_STORAGE
per Android 10) -
/mnt/runtime/write
viene mostrato alle app conWRITE_EXTERNAL_STORAGE
Al momento del fork di Zygote, creiamo uno spazio dei nomi di montaggio per ogni app in esecuzione e associamo il montaggio della vista iniziale appropriata in posizione. Successivamente, quando vengono concesse le autorizzazioni di runtime, vold
allo spazio dei nomi di montaggio delle app già in esecuzione e associa la visualizzazione aggiornata in posizione. Tieni presente che i downgrade delle autorizzazioni comportano sempre la chiusura dell'app.
La funzionalità setns()
utilizzata per implementare questa funzione richiede almeno Linux 3.8, ma le patch sono state trasferite con successo su Linux 3.4. Il test PermissionsHostTest
CTS può essere utilizzato per verificare il corretto comportamento del kernel.