アプリケーションに PING コマンドを実装しようとしています。私が行う方法は、プロセスを作成してからコマンドを実行することです。PING コマンドが終了したら、コンソールから結果を解析します。
メソッドは正常に機能します。私の問題は、PING コマンドの間隔時間の値を変更しようとしたときです。PING は、2 つのパケット送信間の間隔を定義する値をパラメーターとして取ることができます。アプリケーションからメソッドを実行すると、端末エミュレータを使用して実行した結果とは大きく異なります。
間隔の値は、より短い時間でより多くのパケットを送信するようにデバイスに圧力をかけます。私は間隔の値を 0.1 ミリ秒に設定し、両方のケースの結果を確認しました。デバイスは端末エミュレータで動作し、1 ~ 2% の損失があります。私のアプリケーションを使用すると、結果は 70 ~ 80% の損失を示しています。
1ms 間隔の場合、結果は同じです。(デバイスに負荷がかからない)
私が行ったさまざまなテストから、アプリケーション内で PING メソッドが呼び出されると、デバイスが多くのパケットを失うことがわかりました。
これはどのように可能ですか?プロセス内でコマンドを実行すると、端末エミュレーターから実行した場合と同じ結果になると思いました。何かアイデアはありますか?
ここのコードを使用しますAndroidプログラムからシェルコマンドを実行します
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();