我正在尝试执行以下方法:
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];
// if cmd requires an output
// due to the blocking behaviour of read(...)
boolean cmdRequiresAnOutput = true;
if (cmdRequiresAnOutput) {
while( is.available() <= 0) {
try { Thread.sleep(200); } catch(Exception ex) {}
}
while( is.available() > 0) {
readed = is.read(buff);
if ( readed <= 0 ) break;
String seg = new String(buff,0,readed);
Log.i("#>", seg);
}
}
}
os.writeBytes("exit\n");
os.flush();
}
我使用以下输入调用此方法:
String[] cmds = {"/system/bin/sendevent /dev/input/event0 1 107 0 \n", "sleep 1", "/system/bin/sendevent /dev/input/event0 1 107 1 \n"};
try {
runAsRoot(cmds);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但在logcat中我收到以下错误:
07-06 15:19:27.007: E/su(6547): sudb - Opening database
07-06 15:19:27.007: E/(6547): Couldn't open database: unable to open database file
07-06 15:19:27.017: E/su(6547): sudb - Could not open database, prompt user
07-06 15:19:47.082: E/su(6547): select failed with 2: No such file or directory
07-06 15:19:47.082: W/su(6547): request rejected (10060->0 /system/bin/sh)
任何想法是什么问题?
答案 0 :(得分:4)
看起来su二进制文件有问题,而不是你的应用程序。检查您是否可以从'adb shell'成功运行root的shell。 如果'adb shell'从开始给你一个root的shell,运行'su 1000'以失去root权限,然后运行'su'以尝试再次进入root的shell。如果失败,su就无法正常工作。
哦,并且在相关的说明中:确保在另一个线程中运行su,可能通过Handler或AsyncTask,因此它不会阻止您的UI线程。