/storage/emulated/0/
aslında /data/media/0/
öykünmüş / sanal bir dosya sistemi aracılığıyla ortaya çıkar, gerçek değil.
Bu benim önceki cevap atfen olduğunu burada ama daha ilgili ayrıntılarla birlikte.
ANDROID DEPOLAMA
On Android 5 :
/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media
Açık 6+ Android :
# 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>
sembolik bağlantı için, >E>
öykünmüş ve >B>
bağlanma için
* USER-ID
mevcut durumda Multiple Users
veya bu durumda Work Profile
normalde 0
yani cihaz sahibinin bağlanması için
* VIEW
bunlardan biridir read
(izinli uygulamalar için. READ_EXTERNAL_STORAGE) veya write
(izin default
. WRITE_EXTERNAL_STORAGE) / global mount ad alanı, yani zygote dışında)
* Önceki Android sürümlerinde küçük farklılıklar vardı, ancak öykünme kavramı uygulandığından beri aynıydı.
* Android'in takma ad alanı uygulamasıyla ilgili biraz daha ayrıntılı bilgi için, bu cevaba bakın .
Kısacası /sdcard
ve /storage/emulated/0
- bir FAT / vFAT / FAT32 dosya sistemini temsil eden - üzerinden veya öykünme yoluyla /data/media/0
(veya Kabul Edilebilir Depolama/mnt/expand/[UUID]/media/0
durumunda) gelin . FUSE
sdcardfs
Android'e özgü olmamakla birlikte, genellikle Linux ile ilişkili, sembolik bağlantı ve bağlanma bağlaması (bkz. "Bağlama bağlaması oluşturma"), soru temel olarak öykünme kısmıyla ilgili olduğu için bu sorunun kapsamı dışındadır.
EMÜLASYON:
Öykünme neden burada? Öykünülmüş dosya sistemi, temelde iki amaca hizmet eden gerçek dosya sistemindeki ( ext4
veya f2fs
) bir soyutlama katmanıdır :
- Android cihazların PC'lere USB bağlantısını koruyun (günümüzde MTP aracılığıyla uygulanmaktadır)
- Uygulamalara / işlemlere, kullanıcının özel ortamına ve diğer uygulamaların SD kartındaki verilere yetkisiz erişimini kısıtlayın.
Detaylar için Android'in Depolama Yolculuğunu okuyun , özet:
Erken Android aygıtlar dahili depolamada yetersiz kaldı ve bilgisayarların çoğuyla uyumluluk sağlamak için geleneksel olarak FAT dosya sistemi kullanan (fiziksel olarak) harici SD kartlara güveniyordu (Microsoft'un PC dünyasında baskın olduğuna bakın).
Dahili depolama boyutu büyüdüğünde, aynı dosya sistemi dahili (hala "harici" olarak adlandırılan) SD kartına kaydırıldı.
Ancak FAT / vFAT uygulamasının Google tarafından kademeli olarak ele alındığı iki ana sorunu vardı:
- Bugünlerde bir USB sürücüyü bağladığımız gibi Android aygıtları doğrudan PC'lere ( USB Yığın Depolama ) bağlandı. UMS, cihazı blok düzeyinde ortaya çıkarır ve SD kartı Android çerçevesinden ayırır (takmadan çıkar), böylece tüm veriler uygulamalarda kullanılamaz duruma gelir ve muhtemelen birçok işlevi bozabilir.
- FAT (Windows'un geliştirme günlerinde favori olduğu), UNIX izinlerini (mod, uid, gid ve benzer şekilde sembolik bağlantılar ve
ioctls
benzeri FS_IOC_FIEMAP
) uygulamak için asla tasarlanmamıştır . Bu nedenle, SD karttaki tüm veriler (her Android uygulaması bir UNIX / Linux kullanıcısı olduğu ve bir kullanıcı kullanıcısı olduğu için) herhangi bir kısıtlamaya sahip olmadığından, ciddi gizlilik ve güvenlik endişeleri doğurduğundan tüm uygulamalara açıktı.
Bu sorunların her ikisi de öykünme yoluyla ele alındı:
- Gerçek SD kart depolama, UNIX izinlerini tamamen uygulayan dosya sistemini (yavaş yavaş değiştirilerek
/data
) içeren bölüme (veya daha önce bazı cihazlarda bağımsız / sdcard bölümüne) taşındı . ext4
f2fs
- Bu
/data
bölüm UMS imkansız hale getirildi, çünkü bütün bölümler PC'ye 2 nedenden ötürü maruz bırakılamadı: (1)
birçok kullanıcı ve diğer uygulamalardan ve kullanıcılardan korunacak birçok veri içeriyor. (2)
Linux dosya sistemleri Windows tarafından desteklenmemektedir.
Bu yüzden UMS, önceden kurulmuş bir protokol olan PTP'ye istemci-sunucu tipi bir uzantı olan Medya Aktarım Protokolü ile değiştirildi. MTP , blok aygıtı göstermiyor, ancak yazılım yığını üzerinden çalışıyor. MTP sunucusu, Android'de android.process.media
, Android çerçevesinde tam olarak sanallaştırılmış bir uygulama olarak çalışır ( yükseltilmiş görevler yapamaz).
Artık uygulamalar (ve aynı zamanda bir uygulama olan MTP) /data/media
, aynı anda her iki amaca ulaşmak, yani altındaki izin kontrollerini zorlamak ve üst yüzeydeki FAT dosya sistemi gibi görünmek yerine, öykünmüş depolama alanıyla etkileşime giriyor .
Google şimdi aracılığıyla öykünme uyguluyor sdcardfs eksikliklerin üstesinden gelmek için FUSE ; bunlardan bir tanesi girdi / çıktı ek yüküdür, yani okuma / yazma hızlarını iyileştirir.
HARİCİ DEPOLAMA İZNİ: Harici depolamadaki Genel ve Özel dosyalar
kavramı bir örnek kullanarak gösterilebilir:
Install Termux uygulamasını.
Dizinler oluşturun ve .
Dosyaları oluşturun ve .
Aşağıdaki komutları yürütün:
/sdcard/Android/data/com.termux/test_dir
/sdcard/test_dir
/sdcard/Android/data/com.termux/test_file
/sdcard/Android/data/com.termux/test_file
* WhatsApp'in kurulu olması veya başka bir uygulamanın özel klasörünü seçmeniz gerekir.
Şimdi Termux uygulamasını durdurun ve Depolama izni verin . Komutları tekrar yürütün:
Aynı dosya ve dizinlerin izinlerindeki farkı görün. Bu, aynı anda ele alınacak yüzlerce uygulama (kullanıcı) olduğunda, yerel bir Linux dosya sisteminde öykünme olmadan basit bir şekilde mümkün görünmüyor. Bu, aynı dosyanın asıl dosya sistemindeki orijinal izinlerinden bağımsız olarak aynı anda üç farklı izin grubuyla gösterilmesini sağlayan dosya sistemi öykünmesidir:
# 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
Ayrıca bkz . “U # _everybody” UID nedir?
İlgili: