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
相关产品推荐
相关产品推荐

