0

我尝试在我的应用程序上实现 PING 命令。我这样做的方式是创建一个进程,然后执行命令。PING 命令完成后,我从控制台解析结果。

该方法工作正常。我的问题是当我尝试更改 PING 命令的间隔时间值时。PING 可以将一个值作为参数,该值定义了 2 个数据包发送之间的间隔。当我从我的应用程序执行该方法时,结果与使用终端仿真器执行的结果大不相同。

间隔值强调设备在更短的时间内发送更多数据包。我已将间隔值设置为 0.1 毫秒,并检查了两种情况的结果。该设备与终端仿真器配合使用,损耗为 1-2%。使用我的应用程序,结果显示损失了 70-80%。

对于 1ms 的间隔,结果是相同的。(设备没有压力)

从我所做的不同测试中,我意识到当在我的应用程序中调用 PING 方法时,设备会丢失很多数据包。

这怎么可能?我认为在进程中执行命令与从终端仿真器执行命令的结果相同。有什么想法吗?

我使用这里的代码从 android 程序运行 shell 命令

我知道 su 不是必需的....

public void runAsRoot(String[] cmds) throws Exception {
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(p.getOutputStream());
        InputStream is = p.getInputStream();
        for (String tmpCmd : cmds) {
            os.writeBytes(tmpCmd+"\n");
            int readed = 0;
            byte[] buff = new byte[4096];
            boolean cmdRequiresAnOutput = true;
            if (cmdRequiresAnOutput) {
                while( is.available() <= 0) {
                    try { Thread.sleep(5000); } catch(Exception ex) {}
                }

                while( is.available() > 0) {
                    readed = is.read(buff);
                    if ( readed <= 0 ) break;
                    String seg = new String(buff,0,readed);   
                    result=seg; //result is a string to show in textview
                }
            }
        }        
        os.writeBytes("exit\n");
        os.flush();
4

1 回答 1

0

据我了解,从 adb shell 执行命令与让应用程序调用类似的进程不同Process p = Runtime.getRuntime().exec(" A COMMAND ");

这方面的一个示例是 dumpsys 命令,如果您以编程方式执行它,它不会返回结果。(您需要 root 或自定义内核)...

像这个例子

ping -c 1000 -i 0.1 www.google.com当我从 adb 和语法上调用时,一定会发生类似的事情。

于 2013-07-19T17:37:53.333 回答