Android 11(API 30)下Root权限无法读取全部/data/data目录文件问题咨询
API 30 下Root权限读取/data/data完整目录的解决方法
根因说明
Android 11(API 30)针对targetSdk≥30的应用新增了两项限制,即便设备已Root也会触发拦截:
- 强制启用分区存储机制,普通存储权限不再支持访问其他应用的私有数据目录,/data/data默认仅允许访问当前应用自身的文件夹
- 系统对应用进程施加了更严格的SELinux安全上下文隔离,应用进程调用的Root shell默认会继承当前应用的受限上下文,无法突破沙箱访问其他应用私有目录
解决步骤
- 首先在
AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 运行时主动申请特殊文件管理权限,
MANAGE_EXTERNAL_STORAGE属于系统特殊权限,需要跳转系统设置页手动授予:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse("package:${packageName}") startActivity(intent) } }
- 调整libsu的调用配置,避免继承应用进程的受限上下文:
在执行目录读取命令前添加如下配置,可直接替换你现有代码逻辑:
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import com.topjohnwu.superuser.Shell class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 关闭libsu默认的权限检查,避免被系统沙箱规则拦截 Shell.enableAccessCheck = false // 优先使用系统原生工具执行命令,避免被包装的shell限制 val result = Shell.su("/system/bin/ls -la /data/data").exec() Log.e("files", result.out.toString()) } }
额外验证点
如果调整后仍无法读取,可按以下顺序排查:
- 确认使用的Magisk版本≥23.0,低版本Magisk对API30+的Root上下文适配存在缺陷,会导致Root命令继承应用沙箱限制
- 测试时可临时执行
Shell.su("setenforce 0").exec()关闭SELinux验证,确认是否为SELinux规则拦截导致的问题,生产环境可通过自定义SELinux规则替代临时关闭操作
内容的提问来源于stack exchange,提问作者Supertommino
相关产品推荐
相关产品推荐

