Archiviazione con ambito

L'archiviazione con ambito limita l'accesso dell'app all'archiviazione esterna. 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 delle app e dei dati 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 in altre cartelle.

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

  • Leggere e l'accesso in scrittura ai propri file senza permessi
  • Leggi l'accesso ai file multimediali di altre applicazioni con READ_EXTERNAL_STORAGE il permesso
  • Accesso in scrittura ai file multimediali di altre applicazioni è consentito solo con il consenso dell'utente diretta (deroghe accordate alla Galleria e le applicazioni di sistema che sono ammissibili per l'accesso di tutti i file)
  • Nessun lettura o scrittura l'accesso alle directory di dati app esterno di altre applicazioni

Utilizzo dell'archiviazione con ambito con FUSE

Android 11 o superiore supporti Filesystem in userspace (FUSE), che consente il modulo Mediaprovider di esaminare le operazioni sui file nello spazio utente e per l'accesso cancello per i file in base alla politica per consentire, negare, o l'accesso Oscura. 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 dei file funzionanti nelle app).

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

FUSE e SDCardFS

Android 11 il supporto per FUSE è correlato alla deprecazione di SDCardFS , ma non fornisce un'alternativa alla Media Store per i dispositivi che in precedenza utilizzati 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.

Regolazione delle prestazioni FUSE

Android precedentemente supportava 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 di FUSE, Android 8 ha introdotto SDCardFS. Android 11 reintroduce il supporto per FUSE utilizzando un migliore, più collaudato attuazione libfuse che può essere regolato per risolvere i problemi di prestazioni in Android 7 o inferiore.

L'ottimizzazione FUSE include le seguenti modifiche:

  • Bypassare fusibile per Android/data e Android/obb directory per migliorare le prestazioni per le applicazioni di gioco che si basano su queste directory.
  • Ottimizzazioni (come l'ottimizzazione dei rapporti read-ahead e dirty del file system FUSE) per mantenere le letture performanti e la riproduzione dei media fluida.
  • Utilizzo della cache write-back 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 in blocco.

Le modifiche di ottimizzazione di cui sopra possono produrre prestazioni comparabili tra dispositivi FUSE e non FUSE. Ad esempio, testare un Pixel 2 sintonizzato utilizzando FUSE e un Pixel 2 utilizzando Media Store ha riscontrato 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 le 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 di MediaProvider offrono le prestazioni più coerenti, gli sviluppatori di app preoccupati per le prestazioni dovrebbero utilizzare le API di MediaProvider per le loro app.

Mitigare l'impatto sulle prestazioni di FUSE

Impatto sulle prestazioni FUSE è limitata ai grandi utenti di file memorizzati su un solo storage condiviso esterno. Ammasso privato esterno (che include android/data e android/obb directory) è esclusa dal fusibile, mentre di memoria interna (come ad esempio /data/data , dove molte applicazioni memorizzano i dati per tenerlo criptati e protetti) non è montato FUSE.

  • Le app che utilizzano poco l'archiviazione esterna condivisa spesso interagiscono con un set 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 avere alcun impatto sulle prestazioni relativo a FUSE in Android 11.

  • Le app che utilizzano molto l'archiviazione esterna condivisa in genere eseguono operazioni sui file in blocco, come elencare o rimuovere una directory con 1000 file o creare o eliminare una directory con un milione di file nel file system. Operazioni di file Bulk potrebbero essere influenzati da FUSE su Android 11, ma se tali applicazioni sono ammissibili per il MANAGE_EXTERNAL_STORAGE permesso, essi beneficiano delle ottimizzazioni delle prestazioni inclusi nell'aggiornamento ottobre 2020.

Per evitare sovraccarico delle prestazioni FUSE, applicazioni possono memorizzare dati in API di archiviazione o uso rinfusa privati esterni nella ContentProvider classe di bypass FUSE e ottenere un percorso prestazioni ottimizzate. Inoltre, l'aggiornamento ottobre 2020 per il componente di sistema Mediaprovider include ottimizzazioni delle prestazioni per i gestori di file e applicazioni simili (come il backup / ripristino, antivirus) che fissano il MANAGE_EXTERNAL_STORAGE permesso.

Privacy oltre le prestazioni

Sui dispositivi che sono stati sintonizzati per FUSE, i percorsi utente più critici sono ugualmente performanti 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 funzionano peggio in Android 11 (ad esempio, letture o scritture casuali), si consiglia di utilizzare le API di MediaProvider per fornire alle app una modalità di accesso non FUSE, che è l'opzione migliore e con prestazioni costanti.

Aggiornamenti MediaProvider e FUSE

Il Mediaprovider sistema differisce comportamento dei componenti tra le release di 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 crea un file utilizzando File API, potrebbe chiedere a MediaProvider di scansionare il file e registrarlo nel database.

  • In Android 11 o superiore, SDCardFS è deprecato e Mediaprovider diventa il gestore di file system (per FUSE) per la memorizzazione esterna, rendendo il file system su storage esterno e il database Mediaprovider coerente. 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 superiori, Mediaprovider è anche un componente del sistema modulare (un modulo Mainline) che può essere aggiornato fuori dei rilasci Android. Ciò significa che i problemi di prestazioni, privacy o sicurezza riscontrati in MediaProvider possono essere risolti e trasmessi via etere dal Google Play Store o da altri meccanismi forniti dai partner. Anche qualsiasi cosa nell'ambito di ciò che ci si aspetta da un gestore FUSE è aggiornabile, consentendo aggiornamenti per correggere regressioni e bug delle prestazioni FUSE.