Đối với cuộc sống của tôi, tôi không thể tải ứng dụng của mình để nhận phản hồi từ quá trình gọi busybox từ bên trong su shell.Lấy đầu ra từ lệnh busybox trong ứng dụng Android
Tôi đã thử ba phương pháp khác nhau, cũng như thử kết hợp cả ba để làm việc, nhưng tôi không bao giờ có được kết quả từ bất kỳ thứ gì bằng cách sử dụng busybox, chỉ còn lại các lệnh.
Để cụ thể hơn, tôi có thể làm cho nó trả về các lệnh như "ls/data" và "cat suchandsuch.file", nhưng bất kỳ thứ gì bắt đầu bằng "busybox" (nghĩa là busybox mount, busybox free) sẽ không hiển thị bất cứ thứ gì .
Đây là phương pháp mà có sự gần gũi nhất đối với tôi, mã này làm việc với "ls/dữ liệu", nhưng không phải là "busybox miễn phí"
này người ta sẽ chạy lệnh (đối với hầu hết các phần), và trở lại một chuỗi rỗng thay vì lặp vô tận từ đầu vào.
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();
}
Bánh mì nướng gần phía dưới hiển thị mọi thứ từ "ls/data", nhưng khi được đổi thành bất kỳ thứ gì cho busybox, trống hoặc không.
Tôi cũng đã thử cả hai tính năng này, nhưng chưa bao giờ chúng hoạt động. (Tôi đã chuyển quá trình cho họ sau khi lệnh được chạy.)
Cả hai điều này sẽ luôn dẫn đến ứng dụng bị đóng băng ngay khi bạn nhấn nút cho phương pháp.
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 không có đống dấu vết để làm việc với, do đó im bắt đầu để có được một chút bối rối.
Chỉnh sửa với mã được đề xuất bên dưới, uhm, bên dưới: D Tôi đã thay đổi nó một chút để làm cho nó trở thành một thao tác chạy trên giấy phép để xử lý sự cố và thử nghiệm dễ dàng hơn.
Điều này cũng đóng băng khi nó cố gắng đọc luồng đầu vào, và nếu tôi gọi stdin.writeBytes ("exit \ n") trước khi cố gắng đọc luồng nó cho tôi câu trả lời trống từ đóng terminal, nếu tôi gọi nó sau đó, nó lặp đi lặp lại vô tậ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();
}
Dường như nó bỏ qua dòng đầu tiên (dòng thông tin busybox bạn nhận được mỗi khi bạn gọi lệnh) và không bắt phần còn lại của dữ liệu. Ive đã cố gắng tất cả các biến thể tôi có thể nghĩ ra để có được điều này làm việc ngay:/
Nếu ai ấy có một số cái nhìn sâu sắc về vấn đề này, tôi muốn được rất apreciative :)
Đây là vàng! Cảm ơn bạn! –