如何使文件系统以rw参数挂载,通过检测可写分区及/system判断Android设备是否已root
安卓文件系统RW挂载方案与基于挂载状态的Root检测实现
文件系统RW挂载的可行路径
- 普通权限上下文下不存在可以把系统分区切换为RW挂载的通用方案。无论你是普通第三方应用、还是adb连接拿到的默认shell权限,SELinux策略、进程capabilities双重拦截下,执行
mount -o remount,rw操作一定会返回权限拒绝错误。 - 具备可操作性的RW挂载必须满足两个前置条件:
- 进程持有
CAP_SYS_ADMIN能力(即拥有root权限、或是被系统授予特殊权限的系统级进程) - 对应分区的dm-verity校验处于关闭状态(安卓10及以上版本的动态分区默认开启dm-verity,哪怕完成remount操作,写入的内容也会被校验机制拦截)
- 进程持有
- 实际操作时需要先通过读取
/proc/mounts获取目标挂载点对应的真实块设备路径,不能硬编码/system的块设备节点执行挂载——安卓高版本的动态分区机制下,/system实际是逻辑映射挂载点,硬编码路径的remount操作会直接失败。 - 典型的合法操作命令示例:
mount -o remount,rw $(grep ' /system ' /proc/mounts | awk '{print $1}') /system
基于可写性检查的Root检测落地逻辑
- 检测的核心判断依据:未经过修改的原厂出厂设备,所有系统核心分区默认以ro(只读)标志挂载,第三方应用进程在自身沙箱权限上下文下,对/system、/vendor、/product等核心系统路径不具备任何写入权限,更不可能修改这些分区的挂载标志位。
- 具体可落地的检测检查项:
- 直接读取应用进程上下文可访问的
/proc/mounts内容,逐行匹配挂载点为/system、/vendor、/product、/odm的条目,检查挂载标志列是否存在rw标记。注意需要排除定制系统的特例场景:部分厂商会把系统分区下的日志、临时缓存子目录单独以rw标志挂载,这类场景不属于root范畴,不能直接判定为已root - 在应用自身进程权限下,尝试向/system路径下的常见文件(比如
/system/build.prop)执行无副作用的写探测操作(仅尝试打开文件的写句柄,不实际写入内容),如果能成功拿到写句柄,可直接判定设备存在root环境。 - 交叉校验常见root标记路径:比如检查
/system/bin/su、/system/xbin/su这类su可执行文件是否存在,和挂载、可写性检测结果做交叉比对,降低误判概率。
- 直接读取应用进程上下文可访问的
- 误判规避要点:
- 不要用adb shell下观测到的挂载状态作为检测依据。adb shell的权限上下文和第三方应用的沙箱权限完全隔离,你在adb下看到的rw挂载状态,不代表第三方应用运行时能感知到同样的挂载属性,所有检测逻辑必须在应用自身的进程权限范围内执行。
- 不要把
/data分区的rw挂载状态纳入判断。/data作为用户数据分区,出厂状态下默认就是rw挂载,这是系统正常配置,和root状态无关。
内容的提问来源于stack exchange,提问作者Ashraf Ezouli
相关产品推荐
相关产品推荐

