java运行shell命令时DataOutputStream.writeBytes异常

由于工作中需要在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,选择允许后,便能正常运行了。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值