Spazio di archiviazione basato sugli ambiti

Lo spazio di archiviazione limitato limita l'accesso delle app allo spazio di archiviazione esterno. In Android 11 o versioni successive, le app che hanno come target l'API 30 o versioni successive devono utilizzare lo spazio di archiviazione limitato. In precedenza, in Android 10 le app potevano disattivare lo spazio di archiviazione limitato.

Restrizioni di accesso alle app

L'obiettivo dello spazio di archiviazione limitato è proteggere la privacy dei dati delle app e degli utenti. Ciò include la protezione delle informazioni degli utenti (ad es. i metadati delle foto), l'impedimento alle app di modificare o eliminare i file degli utenti senza un'autorizzazione esplicita e la protezione dei documenti sensibili degli utenti scaricati in Download o in altre cartelle.

Le app che utilizzano lo spazio di archiviazione limitato possono avere i seguenti livelli di accesso (l'accesso effettivo è specifico dell'implementazione).

  • Accesso in lettura e scrittura ai propri file senza autorizzazioni
  • Accesso in lettura ai file multimediali di altre app con l'autorizzazione READ_EXTERNAL_STORAGE
  • L'accesso in scrittura ai file multimediali di altre app è consentito solo con il consenso diretto dell'utente (sono state concesse eccezioni a Galleria di sistema e alle app idonee per l'accesso a tutti i file)
  • Nessun accesso in lettura o scrittura alle directory dei dati delle app esterne di altre app

Utilizzare lo spazio di archiviazione limitato con FUSE

Android 11 o versioni successive supporta Filesystem in Userspace (FUSE), che consente al modulo MediaProvider di esaminare le operazioni sui file nello spazio utente e di limitare l'accesso ai file in base alla policy per consentire, negare, o oscurare l'accesso. Le app nello spazio di archiviazione limitato che utilizzano FUSE usufruiscono delle funzionalità di privacy dello spazio di archiviazione limitato e della possibilità di accedere ai file utilizzando un percorso di file diretto (mantenendo il funzionamento delle API File nelle app).

Android 10 applicava le regole dello spazio di archiviazione limitato agli accessi ai file da parte di MediaProvider, ma non per l'accesso diretto al percorso dei file (ad esempio, utilizzando l'API File e le API NDK) a causa dello sforzo richiesto per intercettare le chiamate al kernel. Di conseguenza, le app nello spazio di archiviazione limitato non potevano accedere ai file utilizzando un percorso di file diretto. Questa limitazione ha influito sulla capacità degli sviluppatori di app di adattarsi, in quanto richiedeva modifiche sostanziali al codice per riscrivere l'accesso all'API File all'API MediaProvider.

FUSE e SDCardFS

Il supporto di Android 11 per FUSE non è correlato alla rimozione di SDCardFS, ma fornisce un'alternativa a Media Store per i dispositivi che in precedenza utilizzavano SDCardFS. Dispositivi:

  • I dispositivi che utilizzano Android 11 o versioni successive con kernel 5.4 o versioni successive non possono utilizzare SDCardFS.
  • L'upgrade ad Android 11 o versioni successive può ospitare FUSE su SDCardFS per intercettare le operazioni sui file e raggiungere gli obiettivi di privacy.

Ottimizzazione delle prestazioni di FUSE

In precedenza, Android supportava FUSE in Android 7 o versioni precedenti, in cui lo spazio di archiviazione esterno era montato come FUSE. A causa di problemi di prestazioni e deadlock con questa implementazione di FUSE, Android 8 ha introdotto SDCardFS. Android 11 reintroduce il supporto per FUSE utilizzando un'implementazione migliorata e meglio testata di libfuse che può essere ottimizzata per risolvere i problemi di prestazioni in Android 7 o versioni precedenti.

L'ottimizzazione di FUSE include le seguenti modifiche:

  • Ignorare FUSE per le directory Android/data e Android/obb per migliorare le prestazioni delle app di gioco che si basano su queste directory.
  • Ottimizzazioni (ad es. la regolazione delle proporzioni di lettura anticipata e di dirty del file system FUSE) per mantenere le letture performanti e la riproduzione dei contenuti multimediali fluida.
  • Utilizzo della cache di write-back di FUSE.
  • Memorizzazione nella cache delle autorizzazioni per ridurre gli IPC sul server di sistema.
  • Ottimizzazioni per le app con accesso a tutti i file per velocizzare le operazioni collettive.

Le modifiche di ottimizzazione sopra riportate possono produrre prestazioni comparabili tra i dispositivi FUSE e non FUSE. Ad esempio, il test di un Pixel 2 ottimizzato che utilizza FUSE e di un Pixel 2 che utilizza Media Store ha rilevato prestazioni di lettura sequenziale comparabili (ad esempio, la riproduzione di video) tra l'accesso al percorso dei file e Media Store. Tuttavia, le scritture sequenziali erano leggermente peggiori con FUSE e le letture e scritture casuali potevano essere fino a due volte più lente.

Le misurazioni delle prestazioni possono variare da dispositivo a dispositivo e tra casi d'uso specifici. Poiché le API MediaProvider offrono le prestazioni più coerenti, gli sviluppatori di app che si preoccupano delle prestazioni dovrebbero utilizzare le API MediaProvider per le loro app.

Attenuare l'impatto sulle prestazioni di FUSE

L'impatto sulle prestazioni di FUSE è limitato solo agli utenti che utilizzano molto i file archiviati nello spazio di archiviazione condiviso esterno. Lo spazio di archiviazione privato esterno (che include le directory android/data e android/obb) viene ignorato da FUSE, mentre lo spazio di archiviazione interno (ad esempio /data/data, dove molte app archiviano i dati per mantenerli criptati e sicuri) non è montato su FUSE.

  • Le app che utilizzano poco lo spazio di archiviazione esterno condiviso spesso interagiscono con un insieme limitato di file (in genere meno di 100 file). Queste app usufruiscono delle ottimizzazioni esistenti delle operazioni di lettura e scrittura comuni e non dovrebbero risentire dell'impatto sulle prestazioni di FUSE in Android 11.

  • Le app che utilizzano molto lo spazio di archiviazione esterno condiviso in genere eseguono operazioni collettive sui file, ad esempio elencare o rimuovere una directory con 1000 file oppure creare o eliminare una directory con un milione di file nel file system. Le operazioni collettive sui file potrebbero essere interessate da FUSE su Android 11, ma se queste app sono idonee per l'autorizzazione MANAGE_EXTERNAL_STORAGE, usufruiscono delle ottimizzazioni delle prestazioni incluse nell'aggiornamento di ottobre 2020.

Per evitare il sovraccarico delle prestazioni di FUSE, le app possono archiviare i dati nello spazio di archiviazione privato esterno o utilizzare le API collettive nella classe ContentProvider per ignorare FUSE e ottenere un percorso ottimizzato per le prestazioni. Inoltre, l'aggiornamento di ottobre 2020 del componente di sistema MediaProvider include ottimizzazioni delle prestazioni per i file manager e app simili (ad esempio, backup/ripristino, antivirus) che dispongono dell'autorizzazione MANAGE_EXTERNAL_STORAGE.

Privacy rispetto alle prestazioni

Sui dispositivi ottimizzati per FUSE, la maggior parte dei percorsi utente critici ha prestazioni uguali tra Android 10 e Android 11. Tuttavia, quando si testano i benchmark su un insieme di operazioni sui file, Android 11 potrebbe avere prestazioni peggiori rispetto ad Android 10. Per i pattern di accesso ai file che hanno prestazioni peggiori in Android 11 (ad esempio, letture o scritture casuali), ti consigliamo di utilizzare le API MediaProvider per fornire alle app una modalità di accesso non FUSE, che è l'opzione migliore e con prestazioni coerenti.

Aggiornamenti di MediaProvider e FUSE

Il comportamento del componente di sistema MediaProvider varia a seconda delle release di Android.

  • In Android 10 e versioni precedenti, SDCardFS era il file system e MediaProvider forniva un'interfaccia per le raccolte di file (ad esempio, immagini, video, file musicali e così via). Quando un'app creava un file utilizzando l'API File, poteva chiedere a MediaProvider di scansionare il file e registrarlo nel database.

  • In Android 11 o versioni successive, SDCardFS è obsoleto e MediaProvider diventa il gestore del file system (per FUSE) per lo spazio di archiviazione esterno, rendendo coerenti il file system nello spazio di archiviazione esterno e il database MediaProvider. In qualità di gestore dello spazio utente per il file system FUSE, MediaProvider può intercettare le chiamate al kernel e garantire che le operazioni sui file siano sicure per la privacy.

In Android 11 e versioni successive, MediaProvider è anche un componente di sistema modulare (un modulo Mainline) che può essere aggiornato al di fuori delle release di Android. Ciò significa che i problemi di prestazioni, privacy o sicurezza riscontrati in MediaProvider possono essere risolti e distribuiti via OTA dal Google Play Store o da altri meccanismi forniti dai partner. Qualsiasi elemento nell'ambito di ciò che è previsto da un gestore FUSE è anche aggiornabile, consentendo di correggere le regressioni e i bug delle prestazioni di FUSE.