You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API:已获ROOT权限的设备程序化访问系统文件失败的解决办法

解决办法

问题核心:你调用Runtime.getRuntime().exec("su")只是启动了一个独立的root权限进程,但当前应用的主进程还是普通用户权限,直接用Java的File API访问系统目录自然没有权限,所以listFiles()返回null。

可行的解决思路是在root进程中执行文件操作命令,读取命令输出结果,而非直接用Java的File类。具体实现方式如下:

  • 通过su -c参数直接执行shell命令获取目录内容,比如ls /bin,然后读取命令的输出流解析结果:
try {
    // 执行root权限的ls命令,获取/bin下的文件列表
    Process process = Runtime.getRuntime().exec(new String[]{"su", "-c", "ls /bin"});
    BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    
    // 读取正常输出(目录内容)
    String line;
    System.out.println("/bin下的文件:");
    while ((line = inputReader.readLine()) != null) {
        System.out.println(line);
    }
    
    // 读取错误输出,排查权限问题(比如用户拒绝root授权)
    String errorLine;
    while ((errorLine = errorReader.readLine()) != null) {
        System.err.println("错误信息:" + errorLine);
    }
    
    inputReader.close();
    errorReader.close();
    process.waitFor();
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}
  • 若需要更详细的文件信息(比如文件大小、权限),可以把命令换成ls -l /bin,再解析每行的字段。
  • 部分设备的su可能需要指定完整路径,比如/system/bin/su,可根据实际情况调整命令数组。

额外确认项:

  • 设备确实已成功root,且应用请求root权限时用户已允许。
  • 部分定制ROM可能限制了对/bin目录的访问,这种情况需要检查ROM的权限策略。

内容的提问来源于stack exchange,提问作者Ray Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:52:36