/sdcard/Download
删除文件,则会从/storage/emulated/0/Download
删除文件。如果我将文件添加到/sdcard/Download
中,它将在/storage/emulated/0/Download
中复制它们。/storage/emulated/0/
是什么?出于什么目的,我们在Android文件系统中拥有它?#1 楼
/storage/emulated/0/Download
是文件的实际路径。/sdcard/Download
是到/storage/emulated/0/Download
的实际路径的符号链接但是,实际文件位于
/data/media
的文件系统中然后安装到/storage/emulated/0
(通常也安装到其他安装点)符号链接在计算中,符号链接是任何文件的术语,该文件包含对另一个文件或目录的引用,形式为绝对或相对路径,并影响路径名解析。到1978年,DEC和Data General的RDOS的微型计算机操作系统中已经存在符号链接。
#2 楼
/storage/emulated/0/
实际上是通过仿真/虚拟文件系统公开的,而不是通过实际的文件系统公开的。这是参考我以前的回答,但有更多相关细节。
机器人存储:
在Android 5上:
/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media
在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
*
/data/media/0/
用于symlink,>S>
用于仿真,>E>
用于绑定安装* >B>
或USER-ID
时,当前用户的Multiple Users
,通常是Work Profile
,即设备所有者* 0
是VIEW
之一(对于具有许可权的应用。READ_EXTERNAL_STORAGE)或read
(权限。WRITE_EXTERNAL_STORAGE)或write
(对于在根/全局装载名称空间(即合子外部)中运行的进程)*在先前的Android版本上存在细微差异,但自实施以来,仿真的概念是相同的。*有关Android的mount名称空间实现的更多详细信息,请参见此答案。简而言之,代表FAT / vFAT / FAT32文件系统的
default
和/sdcard
指向/storage/emulated/0
(或/data/media/0
) (通过采用存储的情况)通过/mnt/expand/[UUID]/media/0
或FUSE
仿真。 符号链接和绑定安装(请参阅“创建绑定安装”)不是特定于Android的,而是通常与Linux相关的,因为该问题主要涉及仿真部分。 />
仿真:
为什么在这里仿真?仿真文件系统是实际文件系统(
sdcardfs
或ext4
)上的抽象层,主要用于两个目的:保留Android设备与PC的USB连接(现在通过MTP实现)
限制未经授权访问应用程序/进程对SD卡上用户的私有媒体和其他应用程序的数据。
阅读Android的存储之旅以了解详细信息,摘要为:
早期的Android设备缺少内部存储,只能依靠(物理上)外部SD卡,这些SD卡通常使用FAT系列文件系统来确保与大多数PC的兼容性(请参阅Microsoft在PC世界中的主导地位)。
当内部存储时随着大小的增长,相同的文件系统被转移到内部(仍称为“外部”)SD卡。
但是FAT / vFAT实现存在两个主要问题,谷歌逐渐解决了这些问题:
这些天,就像我们连接USB驱动器一样,Android设备直接连接到PC(USB大容量存储)。 UMS在设备级别公开设备,并从Android框架断开SD卡的连接(卸载),从而使整个数据对应用程序不可用,并可能破坏许多功能。
FAT(在Windows开发时代是Windows最受欢迎的)设计用于实施UNIX权限(模式,uid,gid和类似的符号链接,以及
f2fs
(例如ioctls
))。因此,SD卡上的所有数据对所有应用程序都是可用的(因为每个Android应用程序都是UNIX / Linux用户且具有uid),没有任何限制,因此引起了严重的隐私和安全问题。这些问题已通过仿真得到解决:
实际的SD卡存储已移至
FS_IOC_FIEMAP
分区(或以前在某些设备上为独立的/ sdcard分区),该分区保存了/data
文件系统(逐渐由ext4
取代) ,完全实现UNIX权限。 这种设计无法使用UMS进行,因为整个
f2fs
分区无法再暴露于PC的原因有两个:/data
,其中包含许多设置和应用程序数据,这些数据将受到保护,免受其他应用程序和人类用户的侵害。 (1)
Windows不支持Linux文件系统。因此,UMS被Media Transfer Protocol取代,后者是PTP的客户端-服务器类型扩展-已经建立的协议。 MTP不会公开块设备,而是通过软件堆栈工作。 MTP主机在Android上作为应用程序(
(2)
)在Android框架中完全沙箱运行,无法执行任何升级的任务。现在,这些应用程序(以及MTP,也是一个应用程序)可以与模拟存储进行交互
Google现在正在通过sdcardfs实现仿真,以克服FUSE的缺点;而不是
android.process.media
,同时实现了这两个目的,即在下面强制执行权限检查,并使外观看起来像FAT文件系统。一个主要的问题是输入/输出开销,即提高读/写速度。外部存储权限:
可以使用示例来演示外部存储上的公共和私有文件的概念:
安装Termux应用程序。
创建目录
/data/media
和/sdcard/Android/data/com.termux/test_dir
。创建文件
/sdcard/test_dir
和/sdcard/Android/data/com.termux/test_file
。执行以下命令:
*您应该已安装WhatsApp或选择其他一些应用程序的专用文件夹。
现在强制停止Termux应用程序并授予存储权限。再次执行命令:
请参见相同文件和目录的权限差异。当要同时处理数百个应用程序(用户)时,如果没有在本机Linux文件系统上进行仿真,这似乎不可能简单地实现。这是文件系统仿真,可让同一文件同时具有三组不同的权限公开,而与实际文件系统上的原始权限无关:
# 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
也请参见什么是“ u#_everybody” UID?
相关:
为什么无法访问“ storage / emulated /”目录?
怎么能我在/ storage / emulated / 0内建立了符号链接(或等效符号)?
评论
+1。我认为我误解了有关MTP的部分。 MTP是否需要在目标设备上使用FAT文件系统才能使用?如果不是,那么Google不能将ext4文件系统用于FUSE实施,因为这也可以强制执行应用程序访问共享存储中的数据所需的权限检查吗?
–Firelord♦
18/12/22在6:10
@Firelord在讨论仿真时,重点不在MTP实现上。谷歌已经对MTP协议进行了更改,以满足某些Android需求,并且他们可能可以通过某些本地Linux文件系统来实现它。但是关键是我们需要一个类似FAT的无权限文件系统,该文件系统曾经在Android的早期就可以确保向后兼容,并且符合Android的外部存储概念的设计。我进行了修改以阐明我的观点。
–艾尔凡·拉蒂夫(Irfan Latif)
18/12/22在10:41
评论
如果它稍微解释了为什么它被“模拟”,那么这个答案会更好。我相信Android确实有一些伪造FAT fs的手段,但实际上它有更好的支持,但是我不知道具体细节,因此点击了这个问题,希望学到一些新知识。
–R .. GitHub停止帮助ICE
18/12/20在19:02
@R ..“模拟”恕我直言指出了它是“模拟SD卡”(不是真实的SD卡)这一事实。
– Izzy♦
18/12/20在19:38
@R.。它使用SDCardFS。这是一篇很棒的文章:xda-developers.com/…(存档)
–Nonny Moose
18/12/21在3:16