Android外部存储中/mnt/user等挂载点的差异及权限控制疑问
这些挂载点均与Android系统的隔离、权限管控体系直接相关,但并非作为权限控制的"开关入口",而是承载了不同场景下的系统级隔离逻辑,以下是具体说明:
1. /mnt/user:多用户模式的核心隔离载体
这个挂载点是Android多用户机制的基础,每个系统用户对应一个子目录(如/mnt/user/0为主用户,/mnt/user/1为子用户)。权限管控通过两种底层机制实现:
- 私有挂载命名空间:系统在启动用户进程时,会自动为其切换到对应用户的挂载命名空间,进程只能看到自己用户ID对应的
/mnt/user/<uid>子目录,无法访问其他用户的目录。 - SELinux上下文限制:SEPolicy中定义了严格的规则,限制进程只能访问自身用户上下文对应的
/mnt/user子路径,跨用户的访问会被直接拦截。
这类逻辑无需上层代码显式判断路径,而是由系统的UserManagerService、MountService以及内核挂载机制隐式处理,相关代码集中在frameworks/base/services/core/java/com/android/server/下的用户管理模块,以及system/core/mountd/中的挂载守护进程。
2. /mnt/installer:应用安装流程的临时隔离挂载点
该挂载点专为APK安装流程设计,用于临时挂载APK安装包的镜像文件(通常通过loop设备挂载)。权限管控逻辑为:
- 仅系统安装服务(
PackageManagerService)拥有访问权限,普通应用进程无法直接读取或写入此路径。 - 安装过程中,系统会验证APK签名、解析权限声明,完成后将解压的应用文件迁移至对应应用的数据目录,随后卸载该挂载点,避免残留权限风险。
相关代码可在PackageManagerService的installPackageLI等核心安装方法中找到,同时SEPolicy中会限制只有installer域的进程能访问此路径。
3. /mnt/androidwritable:可写系统分区的受控访问入口
这是Android 10+引入的挂载点,用于支持可写系统分区的场景(如定制ROM、调试环境)。默认系统分区为只读,该挂载点将系统分区的可写部分单独挂载,权限管控通过:
- 文件系统权限:挂载后的目录仅对
root或system组的进程开放写入权限,普通应用仅能读取部分受限内容。 - SELinux规则:SEPolicy严格限制非系统进程的访问,仅允许特定系统域(如
system_server)进行写入操作。
这类逻辑主要在init进程的挂载脚本(如init.rc、init.<device>.rc)中定义,相关代码可查看system/core/init/下的挂载配置模块。
为什么找不到显式判断路径的代码?
这类权限管控并非通过上层代码的if-else判断路径实现,而是依赖底层挂载机制+SELinux策略+系统服务的隐式处理:
- 多用户的隔离是进程命名空间自动切换的结果,无需上层代码干预;
- SELinux规则是在
system/sepolicy/下的policy文件中定义的,而非Java/Kotlin代码; - 系统服务的挂载操作是初始化或流程触发时的自动行为,不会在业务逻辑中显式判断路径。
若需查找相关代码,可重点关注:
- 系统挂载守护进程:
system/core/mountd/ - 用户管理服务:
frameworks/base/services/core/java/com/android/server/UserManagerService.java - 包管理服务:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java - SELinux策略文件:
system/sepolicy/
内容的提问来源于stack exchange,提问作者臧阳阳

