API 31+ 下以root执行命令无法访问/data目录的技术问询
问题分析与解决办法
你遇到的是Android 12(API31/32)引入的挂载命名空间隔离问题:哪怕通过su拿到了root权限,你的应用进程依然处于被隔离的挂载命名空间里,看不到完整的/data/data目录结构;而手动在终端执行时,终端进程是在全局挂载命名空间里,所以能正常访问。
可行解决方法
1. 切换到全局挂载命名空间执行命令
把你的命令改成通过nsenter进入init进程(PID1)的全局挂载空间再执行,示例:
val command = "su -c 'nsenter --mount=/proc/1/ns/mnt touch /data/data/your_target_path'"
原理:init进程的挂载命名空间是系统全局的,包含完整的文件系统视图,用nsenter切换进去后,命令就能获取和终端一致的目录访问权限。
2. 用Magisk su的专属参数(限Magisk root环境)
如果你的设备是通过Magisk获取的root,可以直接用su -M参数跳过命名空间隔离,写法更简洁:
val command = "su -M -c 'touch /data/data/your_target_path'"
-M是Magisk su的特有参数,直接让命令在全局挂载命名空间运行,无需额外调用nsenter。
3. 验证命名空间差异(可选)
你可以在应用里执行su -c 'mount | grep /data',再在终端执行同样的命令,对比输出会发现:应用里的/data挂载路径是被隔离的子命名空间,而终端里的是全局挂载的真实/data目录。
内容的提问来源于stack exchange,提问作者SirBzik
相关产品推荐
相关产品推荐

