Archiviazione mirata

L'archiviazione con ambito limita l'accesso delle app allo spazio di archiviazione esterno. In Android 11 o versioni successive, le app destinate all'API 30 o versioni successive devono utilizzare l'archiviazione con ambito. In precedenza, in Android 10, le app potevano disattivare l'archiviazione con ambito.

Restrizioni di accesso all'app

L'obiettivo dell'archiviazione con ambito è proteggere la privacy dei dati dell'app e dell'utente. 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 autorizzazione esplicita e la protezione dei documenti utente sensibili scaricati in Download o altre cartelle.

Le app che utilizzano l'archiviazione con ambito possono avere i seguenti livelli di accesso (l'accesso effettivo dipende dall'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 (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 dei dati delle app esterne di altre app

Utilizza l'archiviazione con ambito 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 nell'archiviazione con ambito che utilizzano FUSE ottengono le funzionalità di privacy dell'archiviazione con ambito e la possibilità di accedere ai file utilizzando un percorso file diretto (mantenendo le API di file funzionanti nelle app).

Android 10 ha applicato regole di archiviazione con ambito sugli 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 del kernel. Di conseguenza, le app nell'archivio con ambito non potevano accedere ai file utilizzando un percorso file diretto. Questa restrizione ha influito sulla capacità di adattamento degli sviluppatori di app poiché richiedeva modifiche sostanziali al codice per riscrivere l'accesso dell'API File all'API MediaProvider.

FUSIBILE e SDCardFS

Il supporto di Android 11 per FUSE non è correlato alla deprecazione 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'aggiornamento 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 FUSE

Android supportava in precedenza FUSE in Android 7 o versioni precedenti, in cui la memoria esterna era montata come FUSE. A causa di problemi di prestazioni e deadlock con l'implementazione 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:

  • Bypassare 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 read-ahead e dirty del file system FUSE) per mantenere le prestazioni di lettura e la riproduzione multimediale fluida.
  • Utilizzando la cache di write-back FUSE.
  • Autorizzazioni di memorizzazione nella cache per ridurre gli IPC sul server di sistema.
  • Ottimizzazioni per le app con accesso a tutti i file per rendere più veloci le operazioni in blocco.

Le modifiche di ottimizzazione di cui sopra possono produrre prestazioni comparabili tra dispositivi FUSE e non FUSE. Ad esempio, testando un Pixel 2 sintonizzato utilizzando FUSE e un Pixel 2 utilizzando Media Store sono state riscontrate prestazioni di lettura sequenziale comparabili (ad esempio, riproduzione video) tra l'accesso al percorso 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 cambiare da dispositivo a dispositivo e tra casi d'uso specifici. Poiché le API MediaProvider offrono le prestazioni più coerenti, gli sviluppatori di app preoccupati per le prestazioni dovrebbero utilizzare le API MediaProvider per le proprie app.

Mitigare l'impatto sulle prestazioni di FUSE

L'impatto sulle prestazioni di FUSE è limitato agli utenti abituali di file archiviati solo su dispositivi di archiviazione condivisi esterni. L'archiviazione privata esterna (che include le directory android/data e android/obb ) viene bypassata da FUSE, mentre l'archiviazione interna (come /data/data , dove molte app archiviano i dati per mantenerli crittografati e sicuri) non è montata su FUSE.

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

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

Per evitare un sovraccarico delle prestazioni di FUSE, le app possono archiviare dati in un archivio privato esterno o utilizzare API in blocco nella classe ContentProvider per ignorare FUSE e ottenere un percorso con prestazioni ottimizzate. 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, i percorsi utente più critici hanno le stesse prestazioni tra Android 10 e Android 11. Tuttavia, quando si testano i benchmark su una serie di operazioni sui file, Android 11 potrebbe funzionare peggio di Android 10. Per i modelli di accesso ai file che eseguono peggio 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 MediaProvider e FUSE

Il comportamento del componente di sistema MediaProvider differisce tra le versioni Android.

  • In Android 10 e versioni precedenti, SDCardFS era il file system e MediaProvider forniva un'interfaccia per raccolte di file (ad esempio immagini, video, file musicali, ecc.). Quando un'app creava un file utilizzando File API, 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 l'archiviazione esterna, rendendo coerente il file system sull'archiviazione esterna 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 protette dalla 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 versioni Android. Ciò significa che i problemi di prestazioni, privacy o sicurezza rilevati in MediaProvider possono essere risolti e forniti via etere dal Google Play Store o da altri meccanismi forniti dai partner. Tutto ciò che rientra nell'ambito di ciò che ci si aspetta da un gestore FUSE è anche aggiornabile, consentendo agli aggiornamenti di correggere regressioni e bug delle prestazioni di FUSE.