由于工作中需要在android中运行root命令来执行一个动作。 就写了一个很简单的测试程序,结果出现异常,很难找到原因,在网上搜了很久也没有人给出解答。
我的测试代码如下
private void String runRootShell(String[] cmds) {Process process;
try {
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("ls\n"); //此处会抛异常 EPIPE(Broken pipe)
os.writeBytes("exit\n");
os.flush();
ret = process.waitFor();
os.close();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
非常简单的一份代码, 可是这个异常却非常奇怪, 网上很多牛人的代码都用了writeBytes这个方法,别人也都正常。 检查了DataOutputStream的writeBytes方法api,
官方文档上也并未告诉何种情况下会抛出此异常。
某些手机抛的异常不同, Exception 为null
最后发现原因是:
我的手机运行adb shell 后是有root权限的, 但用Runtime.getRuntime().exec("su") 获取root权限时失败, 手机并未对其开通root权限(只开放adb root权限),
这样就导致process.getOutputStream()获取的有问题。从而writeBytes时抛异常EPIPE(Broken pipe)有些手机Excetpion为null。(具体原因不详,有哪位大神可以告诉我原因)
解决方法:
用第三方的root管理应用获取手机的root权限(如百度一键root), 这时再次运行此代码,手机便会弹出是否root授权的dialog,选择允许后,便能正常运行了。