【发布时间】:2017-07-24 21:36:51
【问题描述】:
我想通过我的 Android 应用程序运行 root 命令,该应用程序由后台服务组成,使用以下功能:
public static String runAsRoot(String cmd) {
String output = "";
try {
Process p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
DataOutputStream stdin = new DataOutputStream(p.getOutputStream());
stdin.writeBytes(cmd + "\nexit\n");
InputStream stdout = p.getInputStream();
byte[] buffer = new byte[128];
int read;
int loopCount = 0;
//read method will wait forever if there is nothing in the stream
//so we need to read it in another way than while((read=stdout.read(buffer))>0)
while (true) {
try {
loopCount++;
read = stdout.read(buffer);
output += new String(buffer, 0, read);
if (read < 128 || loopCount > 5) {
//we have read everything
break;
}
}catch (Exception e){
}
}
//Close streams
stdin.close();
stdout.close();
p.destroy();
Log.e("Command output:", output);
} catch (Exception e) {
e.printStackTrace();
output = "exceptionFound";
}
return output;
}
我通过创建线程多次调用此函数:
new Thread(new Runnable() {
@Override
public void run() {
try {
// if (notOnTop>10){
// runAsRoot("reboot now");
// }
int isRunning = controlTopApp();
if (isRunning == 0) {
Log.d("Control_OnTop", "Attendance notOnTop,bringToFront");
runAsRoot("am start -n berk.can.myapp.anotherapp/.MainActivity");
} else if (isRunning == 1) {
Log.d("Control_OnTop", "Attendance");
}
} catch (Exception e) {
Log.e("Runnable App E.", Log.getStackTraceString(e));
}
}
}).start();
我想获得根命令的输出,所以我给出了一个指定的读取值(这里是 128)。但过了一会儿它给出了这个错误并且我的服务被杀死了:
02-28 16:34:41.751 22377-22759/? W/System.err: java.lang.StringIndexOutOfBoundsException: length=128; regionStart=0; regionLength=-1
02-28 16:34:41.760 22377-22759/? W/System.err: at java.lang.String.failedBoundsCheck(String.java:508)
02-28 16:34:41.760 22377-22759/? W/System.err: at java.lang.String.<init>(String.java:225)
02-28 16:34:41.760 22377-22759/? W/System.err: at java.lang.String.<init>(String.java:149)
02-28 16:34:41.760 22377-22759/? W/System.err: at berk.can.myapp.controllerservice.MyService.runAsRoot(MyService.java:271)
02-28 16:34:41.760 22377-22759/? W/System.err: at berk.can.myapp.controllerservice.MyService.controlTopApp(MyService.java:176)
02-28 16:34:41.760 22377-22759/? W/System.err: at berk.can.myapp.controllerservice.MyService.access$000(MyService.java:27)
02-28 16:34:41.760 22377-22759/? W/System.err: at berk.can.myapp.controllerservice.MyService$TimeTask$1.run(MyService.java:103)
02-28 16:34:41.760 22377-22759/? W/System.err: at java.lang.Thread.run(Thread.java:818)
可能是因为多个线程同时运行,为什么我无法通过 try-catch 处理异常并继续运行我的服务?
【问题讨论】: