L'archiviazione mirata limita l'accesso delle app allo spazio di archiviazione esterno. In Android 11 o versioni successive, le app con target API 30 o versioni successive devono utilizzare lo spazio archiviazione soggetto a restrizioni. In precedenza, in Android 10, le app potevano disattivare l'archiviazione con ambito.
Limitazioni di accesso alle app
Lo scopo dello spazio di archiviazione limitato è proteggere la privacy dei dati delle app e degli utenti. Ciò include la protezione delle informazioni degli utenti (ad esempio i metadati delle foto), impedire alle app di modificare o eliminare i file degli utenti senza autorizzazione esplicita e la protezione di documenti utente sensibili 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 per l'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 (sono previste eccezioni per la Galleria di sistema e le 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 basato sugli ambiti con FUSE
Android 11 o versioni successive supporta File system 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 al criterio per consentire, negare o oscurare l'accesso. Le app con accesso allo spazio archiviazione limitato che utilizzano FUSE ottengono le funzionalità di privacy dello spazio archiviazione limitato e la possibilità di accedere ai file utilizzando un percorso file diretto (mantenendo attive le API File nelle app).
Android 10 ha applicato regole di archiviazione basate sugli ambiti agli accessi ai file da parte di MediaProvider, ma non per l'accesso diretto al percorso del file (ad esempio, utilizzando l'API File e le API NDK) a causa dell'impegno richiesto per intercettare le chiamate al kernel. Di conseguenza, le app nell'archiviazione con ambito non potevano accedere ai file utilizzando un percorso file diretto. Questa limitazione ha influito sulla capacità di adattamento degli sviluppatori di app, 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:
- A partire da Android 11 con kernel 5.4 o versioni successive, non è possibile usare 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 veniva montato come FUSE. A causa di problemi di prestazioni e deadlock con l'implementazione di FUSE, Android 8 ha introdotto SDCardFS. Android
11 reintroduce il supporto di FUSE utilizzando un'implementazione migliorata e maggiormente 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
eAndroid/obb
per migliorare le prestazioni delle app di gioco che si basano su queste directory. - Ottimizzazioni (ad esempio la regolazione dei rapporti di lettura anticipata e di file sporchi del file system FUSE) per mantenere le letture efficienti e la riproduzione dei contenuti multimediali fluida.
- Utilizzo della cache di scrittura di FUSE.
- Memorizzazione nella cache delle autorizzazioni per ridurre le IPC al server di sistema.
- Ottimizzazioni per le app con accesso a tutti i file per velocizzare le operazioni collettive.
Le modifiche di ottimizzazione riportate sopra possono produrre prestazioni paragonabili tra i dispositivi FUSE e non FUSE. Ad esempio, il test di un Pixel 2 ottimizzato che utilizza FUSE e un Pixel 2 che utilizza il Media Store ha rilevato prestazioni di lettura sequenziale paragonabili (ad esempio, la riproduzione di video) tra l'accesso al percorso del file e il Media Store. Tuttavia, le scritture sequenziali erano leggermente peggiori con FUSE e le letture e le scritture casuali potevano essere fino al doppio più lente.
Le misurazioni delle prestazioni possono variare da dispositivo a dispositivo e tra use case specifici. Poiché le API MediaProvider offrono le prestazioni più coerenti, gli sviluppatori di app che si preoccupano delle prestazioni devono utilizzare le API MediaProvider per le loro app.
Ridurre l'impatto sulle prestazioni di FUSE
L'impatto sulle prestazioni di FUSE è limitato agli utenti che utilizzano molto i file archiviati solo su archiviazione condivisa esterna. 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 (come /data/data
, dove molte app archiviano i dati per mantenerli criptati e al sicuro)
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 beneficiano delle 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 usano un dispositivo di archiviazione esterno condiviso in genere eseguono operazioni collettive sui file, come elencare o rimuovere una directory che contiene 1000 file oppure creare o eliminare una directory con un milione di file nel file system. Le operazioni su file collettive potrebbero essere interessate da FUSE su Android 11, ma se queste app sono idonee per l'autorizzazione
MANAGE_EXTERNAL_STORAGE
, possono usufruire 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'archiviazione privata esterna o utilizzare API collettive nella classe ContentProvider
per ignorare FUSE e ottenere un percorso ottimizzato per le prestazioni. Inoltre, l'aggiornamento di ottobre 2020 al componente di sistema MediaProvider include ottimizzazioni delle prestazioni per i gestori di file e app simili (come backup/ripristino, antivirus) che dispongono dell'autorizzazione MANAGE_EXTERNAL_STORAGE
.
Privacy rispetto al rendimento
Sui dispositivi ottimizzati per FUSE, la maggior parte dei Critical User Journey ha un rendimento uguale su Android 10 e Android 11. Tuttavia, quando esegui test di benchmark su un insieme di operazioni sui file, Android 11 potrebbe avere un rendimento peggiore rispetto ad Android 10. Per i pattern di accesso ai file con prestazioni peggiori in Android 11 (ad esempio, letture o scritture casuali), ti consigliamo di utilizzare le API MediaProvider per assegnare alle app una modalità di accesso non FUSE, che è l'opzione migliore e con prestazioni sempre migliori.
Aggiornamenti di MediaProvider e FUSE
Il comportamento del componente di sistema MediaProvider è diverso 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 eseguire la scansione del 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 coerente 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 al kernel e garantire che le operazioni sui file siano rispettose della 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 rilevati in MediaProvider possono essere corretti e inviati tramite il Google Play Store o altri meccanismi forniti dal partner. Tutto ciò che rientra nell'ambito di ciò che è previsto da un gestore FUSE è aggiornabile, consentendo di correggere le regressioni e i bug relativi alle prestazioni di FUSE.