/storage/emulated/0/
è effettivamente /data/media/0/
esposto attraverso un filesystem emulato / virtuale, non quello reale.
Questo è in riferimento alla mia precedente risposta qui , ma con dettagli più pertinenti.
STOCCAGGIO ANDROID:
Su Android 5 :
/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media
Su Android 6+ :
# for (Java) Android apps (running inside zygote virtual machine)
# "/storage to VIEW" bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media
# for services/daemons/processes in root/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media
* >S>
per il collegamento simbolico, >E>
per l'emulazione e >B>
per il bind mount
* USER-ID
dell'utente corrente in caso di , Multiple Users
o Work Profile
normalmente 0
quello del proprietario del dispositivo
* VIEW
è uno di read
(per app con permesso.READ_EXTERNAL_STORAGE) o write
(permesso.WRITE_EXTERNAL_STORAGE) o default
(per processi in esecuzione in root / spazio dei nomi di mount globale, cioè al di fuori di zigote)
* Vi erano differenze minori rispetto alle precedenti versioni di Android, ma il concetto di emulazione è stato lo stesso da quando è stato implementato.
* Per ulteriori dettagli sull'implementazione dello spazio dei nomi di mount di Android, vedi questa risposta .
In breve, /sdcard
e /storage/emulated/0
- che rappresentano un filesystem FAT / vFAT / FAT32 - puntano verso /data/media/0
(o /mnt/expand/[UUID]/media/0
in caso di Adoptable Storage ) attraverso FUSE
o sdcardfs
emulazione.
Essendo non specifici di Android ma generalmente correlati a Linux, symlink e bind mount (consultare "Creazione di un bind mount") non rientrano nell'ambito di questa domanda, poiché la domanda riguarda principalmente la parte dell'emulazione.
EMULAZIONE:
Perché l'emulazione è qui? Il filesystem emulato è un livello di astrazione sul filesystem reale ( ext4
o f2fs
) che ha sostanzialmente due scopi:
- Mantieni la connettività USB dei dispositivi Android ai PC (implementata tramite MTP ora al giorno)
- Limitare l'accesso non autorizzato di app / processi ai media privati dell'utente e ai dati di altre app sulla scheda SD.
Leggi il percorso di archiviazione di Android per i dettagli, il riepilogo è:
I primi dispositivi Android erano a corto di memoria interna e si basavano su schede SD (fisicamente) esterne che tradizionalmente utilizzano la famiglia di file system FAT per garantire la compatibilità con la maggior parte dei PC (fare riferimento al dominio di Microsoft sul mondo dei PC).
Quando le dimensioni della memoria interna sono aumentate, lo stesso filesystem è stato spostato sulla scheda SD interna (ancora chiamata "esterna").
Ma l'implementazione FAT / vFAT ha avuto due problemi principali che sono stati affrontati gradualmente da Google:
- I dispositivi Android sono stati collegati direttamente ai PC ( USB Mass Storage ) proprio come colleghiamo un'unità USB in questi giorni. UMS espone il dispositivo a livello di blocco e disconnette la scheda SD dal framework Android (disinstallazione), rendendo così i dati interi non disponibili per le app e probabilmente rompendo molte funzionalità.
- FAT (essendo il preferito di Windows nei giorni di sviluppo) non è mai stato progettato per imporre permessi UNIX (mode, uid, gid e similmente link simbolici , e
ioctls
simili FS_IOC_FIEMAP
). Quindi, tutti i dati sulla scheda SD erano disponibili per tutte le app (poiché ogni app Android è un utente UNIX / Linux e ha un uid) senza restrizioni, sollevando quindi seri problemi di privacy e sicurezza.
Entrambi questi problemi sono stati risolti attraverso l'emulazione:
- La memoria effettiva della scheda SD è stata spostata nella
/data
partizione (o partizione indipendente / sdcard su alcuni dispositivi in precedenza) che contiene il ext4
filesystem (gradualmente sostituito da f2fs
), implementando completamente le autorizzazioni UNIX.
- Questo design ha reso impossibile l'utilizzo di UMS perché
/data
non è stato possibile esporre l' intera partizione al PC per altri 2 motivi: (1)
contiene molte impostazioni e dati delle app che devono essere protetti da altre app e dagli utenti umani. (2)
I filesystem Linux non sono supportati da Windows.
Quindi UMS è stato sostituito con Media Transfer Protocol che è un'estensione di tipo client-server a PTP - un protocollo già stabilito. MTP non espone il dispositivo a blocchi ma funziona tramite stack software. L'host MTP funziona su Android come un'app ( android.process.media
) completamente sandbox nel framework Android, non in grado di eseguire attività di escalation.
Ora le app (e MTP, che è anche un'app) interagiscono con l'archiviazione emulata anziché /data/media
, raggiungendo entrambi gli scopi allo stesso tempo, cioè applicando i controlli delle autorizzazioni sottostanti e assomigliando al filesystem FAT sulla superficie superiore.
Google sta ora implementando l'emulazione tramite sdcardfs per superare le carenze di FUSE ; uno dei principali è l'overhead di input / output, ovvero per migliorare la velocità di lettura / scrittura.
AUTORIZZAZIONI DI MEMORIZZAZIONE ESTERNE: il
concetto di file pubblici e privati su memoria esterna può essere dimostrato usando un esempio:
Installa l'app Termux.
Creare directory /sdcard/Android/data/com.termux/test_dir
e /sdcard/test_dir
.
Creare file /sdcard/Android/data/com.termux/test_file
e /sdcard/Android/data/com.termux/test_file
.
Eseguire i seguenti comandi:
* Dovresti avere WhatsApp installato o selezionare la cartella privata di qualche altra app.
Ora Forza Arresta l'app Termux e concedi l' autorizzazione di archiviazione . Eseguire nuovamente i comandi:
Vedi la differenza nelle autorizzazioni degli stessi file e directory. Questo sembra non essere semplicemente possibile senza emulazione su un filesystem Linux nativo quando ci sono centinaia di app (utenti) da trattare contemporaneamente. Questa è l'emulazione del file system che consente di esporre lo stesso file con tre diversi set di autorizzazioni contemporaneamente indipendentemente dalle autorizzazioni originali sul file system effettivo:
# touch /data/media/0/test_file
# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file
# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file
Vedi anche Cos'è l'UID "u # _everybody"?
Relazionato: