我在Android中使用getRuntime.exec()来执行一些shell命令并处理输出。其中存在一些命令,我的程序没有给出任何输出且给出了错误提示"No such file or directory",但相同的命令在命令提示符下输出了正确结果。
示例
我在查询所插入的Android USB速率与协议时,所有USB设备节点可以在/sys/bus/usb/devices下对比找到。
1、比如shell下查询USB速率信息。
2、通过代码Runtime.getRuntime().exec()查询
Process p = Runtime.getRuntime().exec("find ./sys/bus/usb/devices/usb*/ -name speed");
此时运行报错:No such file or directory
3、因为shell命令中的一些符号比如*, ?, >, < , | 是通过/bin/sh -c来做解释后再传递给所调用的命令的,但对于java的Process来说,不会识别这些符号,因此我们必须强制调用/bin/sh -c来帮我们做符号解释:
String cmd = "find ./sys/bus/usb/devices/usb*/ -name speed";
String[] cmdArray = {"/bin/sh", "-c", cmd};//解决shell命令*通配符不识别问题
Process p = Runtime.getRuntime().exec(cmdArray);
4、平台适配:移植到另一个MTK平台时出现了报错:java.io.IOException: Cannot run program “/bin/sh”: error=13, Permission denied…
看log是找不到/bin/sh解释器,发现系统所用的解释器路径变成/system/bin/sh了。java层也适配修改一下路径即可解决。