从 Android 执行 Shell 命令:常见陷阱分析
在 Android 开发中,可能会出现需要执行 shell 命令的情况。然而,当尝试从 Java 应用程序中执行此类命令时,可能会出现常见的陷阱。使用“su”命令可以观察到这样一个陷阱,该命令在 root 设备中授予超级用户权限。
考虑使用 screenrecord 命令进行屏幕捕获的场景。当通过应用程序模拟器终端执行该命令时,该命令成功启动记录。但是,使用 Runtime.getRuntime().exec() 方法从 Java 执行相同的命令无法创建记录。
差异是由将命令传递给“su”进程的方法引起的。模拟器终端允许直接输入命令,而在 Java 中,命令必须通过其标准输入作为“su”进程的输入提供。
解决方案包括将命令重定向到“su”进程的使用 DataOutputStream 的标准输入。下面是修改后的代码片段:
try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n"); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); }
通过将命令重定向到标准输入,“su”进程接收命令并使用root权限提升它,成功执行屏幕录制。该技术确保可以从 Android 应用程序有效执行 shell 命令,甚至需要超级用户权限。
以上是为什么在 Java 和模拟器终端中执行'su”命令不同?的详细内容。更多信息请关注PHP中文网其他相关文章!