1.代码位置
system/vold/ 路径下,查看bp文件,发现是编译system/vold/main.cpp编译生成可执行文件vold
2.app侧调用代码流程
2.1 整体框架
2.2 StorageManagerService调用栈
- 调用复位Vold的操作
2.3 vold中umount的流程
- mount的日志
I vold : Mounting emulated fuse volume
I vold : Bind mounting /data/media to /mnt/pass_through/0/emulated
I vold : Bind mounting //data/media/0/Android/data on /mnt/user/0/emulated/0/Android/data
I vold : Bind mounted //data/media/0/Android/data on /mnt/user/0/emulated/0/Android/data
I vold : Bind mounting //data/media/0/Android/obb on /mnt/user/0/emulated/0/Android/obb
I vold : Bind mounted //data/media/0/Android/obb on /mnt/user/0/emulated/0/Android/obb
I vold : Configuring read_ahead of /mnt/user/0/emulated fuse filesystem to 256kb
I vold : Writing 256 to /sys/class/bdi/0:108/read_ahead_kb
I vold : Configuring max_ratio of /mnt/user/0/emulated fuse filesystem to 40
I vold : Writing 40 to /sys/class/bdi/0:108/max_ratio
- unmount的日志
49 10441 I vold : Killing all processes referencing /storage/emulated/0
49 10441 I vold : Unmounting /mnt/user/0/emulated/0/Android/data
49 10441 I vold : Unmounted /mnt/user/0/emulated/0/Android/data
49 10441 I vold : Unmounting /mnt/user/0/emulated/0/Android/obb
49 10441 I vold : Unmounted /mnt/user/0/emulated/0/Android/obb
49 10441 I vold : Unmounting fuse path /mnt/user/0/emulated
49 10441 I vold : Unmounting pass_through_path /mnt/pass_through/0/emulated
2.3.1 关于fuse
MountUserFuse 的背景
- Emulated Storage
- 在 Android 中,用户对存储的访问并不是直接操作底层物理存储,而是通过模拟层(emulated layer)。
- 例如,路径 /storage/emulated/0 是映射到实际的存储设备(如内置存储或 SD 卡)。
这种机制的核心是为了实现多用户支持和存储隔离。
- FUSE (Filesystem in Userspace)
- FUSE 是一种在用户空间实现文件系统的技术。它允许非特权用户通过用户态程序操作虚拟文件系统。
- 在 Android 中,FUSE 被用来为应用程序提供访问存储的接口,并支持权限控制、文件操作拦截等功能。
- 挂载点管理
- MountUserFuse 的任务是为每个用户创建和管理 FUSE 挂载点,以便每个用户只能访问自己的存储内容。