私の人生の間、私のアプリケーションはsuシェル内からbusyboxを呼び出すプロセスからの応答を得ることができません。Androidアプリ内のbusyboxコマンドから出力を取得する
私は3つの方法を試してみましたが、3つの方法を組み合わせて試してみましたが、残りのコマンドはbusyboxを使って何も出力できません。
具体的には、 "ls/data"や "cat suchandsuch.file"のようなコマンドを返すことができますが、 "busybox"(つまりビジーボックスマウント、ビジーボックスフリー)で始まるものは何も表示しません。
これは私のために最も近いを得た方法であった、このコードは、「LS /データ」で動作しますが、ない「busyboxの自由」
この1つは(大部分)コマンドを実行します、とリターン無限ループの代わりに入力ストリームから空の文字列。
Process p;
try {
p = Runtime.getRuntime().exec(new String[]{"su", "-c", "/system/bin/sh"});
DataOutputStream stdin = new DataOutputStream(p.getOutputStream());
stdin.writeBytes("ls /data\n");
DataInputStream stdout = new DataInputStream(p.getInputStream());
byte[] buffer = new byte[4096];
int read = 0;
String out = new String();
while(true){
read = stdout.read(buffer);
out += new String(buffer, 0, read);
if(read<4096){
break;
}
}
Toast.makeText(getApplicationContext(), out, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
ボトム付近のトーストは、 "ls/data"のすべてを表示しますが、ビジーボックスの場合は空白またはヌルに変更されます。
私もこれらの両方を試しましたが、それらの方々が働いていました。 (私はコマンドを実行した後にプロセスを渡していました)
メソッドのボタンを押すと、これらの両方がアプリをフリーズすることになります。
String termReader(Process process){
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
try {
int i;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((i = reader.read(buffer)) > 0) output.append(buffer, 0, i);
reader.close();
return output.toString();
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
}
String processReader(Process process){
InputStream stdout = process.getInputStream();
byte[] buffer = new byte[1024];
int read;
String out = new String();
while(true){
try {
read = stdout.read(buffer);
out += new String(buffer, 0, read);
if(read<1024){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return out;
}
Theresは動作するためのスタックトレースがないので、少し詰まってしまいます。
以下に提案するコードで編集しました.D 簡単なトラブルシューティングとテストのために、1回の実行で問題なく動作するように少し変更しました。
これは入力ストリームを読み込もうとするとフリーズし、ストリームを読み込もうとする前にstdin.writeBytes( "exit \ n")を呼び出すと、ターミナルを閉じて空の答えを返しますその後、それは無限にループする。
void Run() {
String command = "busybox traceroute\n";
StringBuffer theRun = null;
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream stdin = new DataOutputStream(process.getOutputStream());
stdin.writeBytes(command);
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
theRun = output.append(buffer, 0, read);
}
reader.close();
process.waitFor();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Toast.makeText(getApplicationContext(), theRun, Toast.LENGTH_SHORT).show();
}
それは、その最初の行(あなたがコマンドを呼び出すたびに取得するbusyboxの情報ライン)をスキップし、データの残りの部分をキャッチないように思えます。誰のは、この上でいくつかの洞察力を持っている場合/
、私は大いにapreciativeだろう:)
これは金であります!ありがとうございました! –