Spazio di archiviazione

Icona HAL della memoria esterna Android

Android si è evoluto nel tempo per supportare un'ampia varietà di tipi e funzionalità di dispositivi di archiviazione. Tutte le versioni di Android supportano i dispositivi con archiviazione tradizionale , che include archiviazione portatile ed emulata. L'archiviazione portatile può essere fornita da un supporto fisico, 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 lungo periodo di tempo, ma non è legato al dispositivo e può essere rimosso. Le schede SD sono disponibili come memoria portatile a partire da Android 1.0; Android 6.0 ha aggiunto il supporto USB. Lo spazio di archiviazione emulato viene fornito esponendo una porzione di spazio di archiviazione interno tramite un livello di emulazione ed è disponibile a partire da Android 3.0.

A partire da Android 6.0, Android supporta l'archiviazione adottabile , fornita da supporti fisici, come una scheda SD o USB, crittografati e formattati per comportarsi come archiviazione interna. Lo storage adottabile può archiviare tutti i tipi di dati dell'applicazione.

Autorizzazioni

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 sono ora sintetizzati in base alla struttura delle directory. Ciò consente alle app di gestire le directory specifiche del pacchetto su uno spazio di archiviazione esterno senza richiedere che dispongano dell'ampia autorizzazione WRITE_EXTERNAL_STORAGE . Ad esempio, l'app con il nome del pacchetto com.example.foo ora può accedere liberamente Android/data/com.example.foo/ su dispositivi di archiviazione esterni senza autorizzazioni. Queste autorizzazioni sintetizzate vengono ottenute racchiudendo i dispositivi di archiviazione grezzi in un demone FUSE.

A partire da Android 10, le app destinate ad Android 9 e versioni successive riducono l'impostazione predefinita allo spazio di archiviazione legacy e possono attivare l'archiviazione isolata. Le app destinate ad Android 10 e che utilizzano per impostazione predefinita l'archiviazione isolata possono disattivarla temporaneamente . Utilizza 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, se il programma di installazione non ha inserito l'app nella whitelist, l'autorizzazione controlla l'accesso solo alle raccolte audio e visive, senza accesso alla scheda SD. Ciò si applica anche se l'app richiede spazio di archiviazione legacy. Per ulteriori informazioni sulle restrizioni rigide e 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 la disattiva.

Lo stato della lista bianca può essere specificato solo al momento dell'installazione e non può essere modificato finché l'app non viene installata.

Per ulteriori informazioni sull'impostazione dell'autorizzazione READ_EXTERNAL_STORAGE , vedere setWhitelistedRestrictedPermissions() nella classe PackageInstaller.SessionParams .

Android 13 introduce autorizzazioni multimediali granulari per supportare le app che accedono ai file multimediali creati da altre app. Le app devono richiedere una o più autorizzazioni multimediali granulari elencate in Autorizzazioni multimediali granulari anziché l'autorizzazione READ_EXTERNAL_STORAGE .

Android 14 si basa su autorizzazioni multimediali granulari per consentire agli utenti di concedere un accesso parziale alla propria libreria multimediale visiva quando le app richiedono autorizzazioni multimediali. Per ulteriori informazioni, consulta Concedere l'accesso parziale a foto e video .

Autorizzazioni di esecuzione

Android 6.0 introduce un nuovo modello di autorizzazioni di runtime in cui le app richiedono funzionalità quando necessarie in fase di runtime. Poiché il nuovo modello include le autorizzazioni READ/WRITE_EXTERNAL_STORAGE , la piattaforma deve concedere dinamicamente l'accesso allo spazio di archiviazione senza terminare 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 root in cui risiedono adbd e altri componenti di sistema.
  • /mnt/runtime/read viene mostrato alle app con READ_EXTERNAL_STORAGE (imposta LEGACY_STORAGE per Android 10)
  • /mnt/runtime/write viene mostrato alle app con WRITE_EXTERNAL_STORAGE

Al momento del fork di Zygote, creiamo uno spazio dei nomi di montaggio per ogni app in esecuzione e colleghiamo il montaggio alla vista iniziale appropriata in posizione. Successivamente, quando vengono concesse le autorizzazioni di runtime, vold passa allo spazio dei nomi di montaggio delle app già in esecuzione e bind monta la vista aggiornata in posizione. Tieni presente che i downgrade delle autorizzazioni comportano sempre la chiusura dell'app.

La funzionalità setns() utilizzata per implementare questa funzionalità richiede almeno Linux 3.8, ma è stato effettuato con successo il backport delle patch su Linux 3.4. Il test CTS PermissionsHostTest può essere utilizzato per verificare il corretto comportamento del kernel.