Spazio di archiviazione basato sugli ambiti

Lo spazio di archiviazione isolato limita l'accesso dell'app alla memoria esterna. Su Android 11 o versioni successive, le app che hanno come target l'API 30 o versioni successive devono utilizzare lo spazio di archiviazione isolato. In precedenza, in Android 10, le app potevano disattivare lo spazio di archiviazione isolato.

Limitazioni di accesso alle app

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

Le app che utilizzano l'archiviazione isolata 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 autorizzazione READ_EXTERNAL_STORAGE
  • L'accesso in scrittura ai file multimediali di altre app è consentito solo con il consenso diretto dell'utente (eccezioni concesse a Galleria di sistema e alle app idonee per l'accesso a tutti i file)
  • Nessun accesso in lettura o scrittura alle directory di dati delle app esterne di altre app

Utilizzare l'archiviazione con ambito con FUSE

Android 11 o versioni successive supportano Filesystem in Userspace (FUSE), che consente al modulo MediaProvider di esaminare le operazioni sui file nello spazio utente e di controllare l'accesso ai file in base alle norme per consentire, negare o oscurare l'accesso. Le app nell'archiviazione isolata che utilizzano FUSE ottengono le funzionalità di privacy dell'archiviazione isolata e la possibilità di accedere ai file utilizzando un percorso di file diretto (mantenendo il funzionamento delle API File nelle app).

Android 10 ha applicato regole di archiviazione con ambito ai file di accesso di MediaProvider, ma non per l'accesso diretto al percorso dei file (ad esempio, utilizzando le API File e NDK) a causa dello sforzo richiesto per intercettare le chiamate al kernel. Di conseguenza, le app nello spazio di archiviazione con ambito 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 al ritiro di SDCardFS, ma fornisce un'alternativa a Media Store per i dispositivi che in precedenza utilizzavano SDCardFS. Dispositivi:

  • L'avvio con Android 11 o versioni successive utilizzando il kernel 5.4 o versioni successive non può utilizzare SDCardFS.
  • L'upgrade ad Android 11 o versioni successive può ospitare FUSE su SDCardFS per intercettare le operazioni sui file e soddisfare gli obiettivi di privacy.

Ottimizzazione delle prestazioni di FUSE

In precedenza, Android supportava FUSE in Android 7 o versioni precedenti, in cui l'archiviazione esterna veniva montata 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 di FUSE utilizzando un'implementazione migliorata e testata di libfuse che può essere ottimizzata per risolvere i problemi di prestazioni in Android 7 o versioni precedenti.

La messa a punto 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 (come la regolazione dei rapporti di lettura anticipata e dirty del file system FUSE) per mantenere le letture efficienti e la riproduzione multimediale fluida.
  • Utilizzo della cache write-back di FUSE.
  • Autorizzazioni di memorizzazione nella cache per ridurre gli IPC al server di sistema.
  • Ottimizzazioni per le app con accesso a Tutti i file per velocizzare le operazioni collettive.

I perfezionamenti di ottimizzazione descritti sopra possono produrre prestazioni comparabili tra i dispositivi FUSE e non FUSE. Ad esempio, i test di un Pixel 2 ottimizzato con FUSE e di un Pixel 2 con Media Store hanno rilevato prestazioni di lettura sequenziale comparabili (ad esempio, riproduzione video) tra l'accesso al percorso del 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 agli utenti che utilizzano spesso file archiviati solo su spazio di archiviazione condiviso esterno. L'archiviazione privata esterna (che include le directory android/data e android/obb) viene ignorata da FUSE, mentre l'archiviazione interna (ad esempio /data/data, dove molte app archiviano i dati per mantenerli criptati e sicuri) non viene montata da FUSE.

  • Le app che utilizzano poco lo spazio di archiviazione esterno condiviso spesso interagiscono con un numero limitato di file (in genere meno di 100). Queste app traggono vantaggio dalle ottimizzazioni esistenti delle operazioni di lettura e scrittura comuni e non dovrebbero riscontrare alcun impatto sulle prestazioni correlato a FUSE in Android 11.

  • Le app che utilizzano molto l'archiviazione esterna condivisa in genere eseguono operazioni sui file collettive, 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 sui file collettivi potrebbero essere interessate da FUSE su Android 11, ma se queste app sono idonee per l'autorizzazione MANAGE_EXTERNAL_STORAGE, beneficiano delle ottimizzazioni delle prestazioni incluse nell'aggiornamento di ottobre 2020.

Per evitare l'overhead delle prestazioni di FUSE, le app possono archiviare i dati in un archivio privato esterno o utilizzare le API collettive nella classe ContentProvider per bypassare 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 (come 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 equivalenti tra Android 10 e Android 11. Tuttavia, quando si testano i benchmark su un insieme di operazioni sui file, Android 11 potrebbe avere un rendimento inferiore rispetto ad Android 10. Per i pattern di accesso ai file che hanno un rendimento peggiore in Android 11 (ad esempio, letture o scritture casuali), consigliamo di utilizzare le API MediaProvider per fornire alle app una modalità di accesso non FUSE, che è l'opzione migliore e con prestazioni costanti.

Aggiornamenti di MediaProvider e FUSE

Il comportamento del componente di sistema MediaProvider varia a seconda delle versioni 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 è deprecato e MediaProvider diventa il gestore del file system (per FUSE) per lo spazio di archiviazione esterno, rendendo coerenti il file system sullo 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 del 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 ci si aspetta da un gestore FUSE è anche aggiornabile, consentendo di correggere regressioni e bug delle prestazioni di FUSE.