Android获Root权限后,如何通过libsu访问其他应用的shared_prefs?
解决libsu无法访问其他应用/data/data目录的问题
问题背景
已获取Root权限,但使用libsu的SuFile或执行ls /data/data命令时,仅能看到自身应用和com.google.android.gms的目录;而adb shell、Termux、MiXplorer在Root状态下可正常访问其他应用的shared_prefs文件夹。
核心原因分析
- Android 11+挂载命名空间隔离:高版本Android为每个应用创建独立挂载命名空间,普通Root进程默认处于应用自身的挂载空间,无法读取系统完整的
/data/data目录结构。 - SELinux权限限制:即使拥有Root权限,SELinux Enforcing模式下,普通Root进程的上下文可能不允许访问其他应用的私有数据目录。
解决方案
1. 进入系统Master挂载空间(推荐)
针对Android 11+的挂载隔离问题,启动Root Shell时添加--mount-master参数,进入系统级挂载空间:
// 创建带mount-master参数的Root Shell(Magisk SU适用) val shell = Shell.Builder.create() .addFlags("--mount-master") .build() shell.open().use { activeShell -> // 执行ls命令查看完整的/data/data目录 val lsResult = activeShell.cmd("ls /data/data").exec() Log.d("RootAccess", lsResult.out.joinToString("\n")) // 检查目标shared_prefs目录是否存在 val prefsDir = SuFile(activeShell, "/data/data/com.package/shared_prefs") Log.d("SuFileCheck", "目录存在:${prefsDir.exists()}") }
注:不同Root工具参数可能不同,SuperSU可使用
-m代替--mount-master,请根据实际Root环境调整。
2. 直接访问真实路径
高版本Android中/data/data是指向/data/user/0的软链接,直接访问该真实路径可绕过部分挂载限制:
val realPrefsPath = "/data/user/0/com.package/shared_prefs" val result = Shell.cmd("ls $realPrefsPath").exec() Log.d("RealPathAccess", result.out.joinToString("\n"))
3. 排查SELinux状态(可选)
若上述方法无效,先检查SELinux状态:
val selinuxStatus = Shell.cmd("getenforce").exec().out.firstOrNull() Log.d("SELinuxStatus", "当前状态:$selinuxStatus")
若输出为Enforcing,可临时切换为Permissive(重启后自动恢复):
Shell.cmd("setenforce 0").exec()
注意:此操作会降低系统安全性,仅建议调试时使用,正式发布的应用请勿采用。
4. 检查ROM的Root权限配置
部分定制ROM(如MIUI)的Root权限管理会限制应用可执行的命令,需确保你的应用被授予完整Root权限,而非仅允许特定命令。
验证方法
执行以下命令查看当前Shell的挂载空间信息,确认是否处于Master空间:
Shell.cmd("cat /proc/self/mountinfo | grep /data/data").exec().let { Log.d("MountInfo", it.out.joinToString("\n")) }
若输出包含shared:1或master字样,说明已进入正确的系统挂载空间。
内容的提问来源于stack exchange,提问作者Divan
相关产品推荐
相关产品推荐

