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

Android Java代码获Root权限仍无法删除文件,求排查原因

问题分析:Root权限下执行rm命令无效的原因及修复

你当前的代码无法正常工作,核心问题集中在以下几点:

1. Runtime.exec的命令参数传递错误

Runtime.getRuntime().exec("su rm -r /path")的写法完全错误。exec方法不会像终端shell那样自动解析空格分隔的参数,它会把整个字符串当作单个可执行文件的路径去查找——而系统中根本不存在名为su rm -r /data/user/0/com.rick.app的程序,自然不会执行到rm命令。

正确的写法是将命令拆分为字符串数组,通过su -c参数来执行完整的shell命令:

Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "rm -r /data/user/0/com.rick.app"});

su -c的作用是让root用户执行后续引号内的完整shell指令。

2. 未捕获命令执行的错误信息

代码仅调用了p.waitFor(),但没有读取Process的错误流(ErrorStream)和输入流(InputStream)。如果命令执行失败(比如路径不存在、SELinux限制),你无法获取具体的错误原因,也就无法定位问题。

建议添加流读取逻辑用于调试:

private void readStream(InputStream is) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    String line;
    while ((line = reader.readLine()) != null) {
        Log.d("RootCmd", line); // 打印命令输出,排查问题
    }
    reader.close();
}

// 在exec后调用
readStream(p.getInputStream());
readStream(p.getErrorStream());

3. 重复执行无效路径命令

代码中重复执行了/storage/emulated/0/Android/data/com.rick.app和/storage/emulated/0/Android/data/com.rick.app/的删除命令,这不仅没有意义,还可能因为路径末尾的斜杠导致shell处理异常。

4. 路径有效性与不必要操作

  • /data/app/com.rick.app是应用安装包的存放目录,清除缓存和数据完全不需要删除这个目录,反而会导致应用无法正常启动。
  • 部分路径(比如/data/user_de/0/com.rick.app)仅在特定设备或Android版本存在,强行删除不存在的路径会抛出错误,中断后续命令执行。

5. SELinux限制

即使获取了Root权限,如果设备的SELinux处于Enforcing模式,可能会阻止直接删除某些系统目录下的文件。可以尝试临时关闭SELinux再执行删除(执行后恢复):

Runtime.getRuntime().exec(new String[]{"su", "-c", "setenforce 0; rm -r /data/user/0/com.rick.app; setenforce 1"});

注意:关闭SELinux会降低系统安全性,仅在必要时使用。


内容的提问来源于stack exchange,提问作者Rick Wilting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:45:39