我有一个通过 Magisk 进行 root 的设备。我想制作一个应用程序来执行“su ls data/data”。但是当我运行应用程序时,它只返回两个包,例如:com.google.android.gms、com.nghiatd.nghiaclicker(这是我的应用程序的包名称)。但是,当我在终端模拟器应用程序上执行该命令时,它返回了数据/数据文件夹中应用程序的完整包名称。我在清单中添加了读、写、ACCESS_SUPERUSER 权限。 Magisk 已授予许可。这是功能:
`
public static String executeCommandSU( String command)
{
try {
Process process = new ProcessBuilder().command("su").start();
process.getOutputStream().write((command + "\n").getBytes("ASCII"));
//process.getOutputStream().write(("ls data" + "\n").getBytes("ASCII"));
process.getOutputStream().flush();
SystemClock.sleep(3000);
StringBuffer sb = new StringBuffer();
BufferedReader bre = new BufferedReader(
new InputStreamReader(process.getErrorStream()));
while (bre.ready()) {
sb.append(bre.readLine());
}
String s = sb.toString();
if (!s.replaceAll(" ", "").equalsIgnoreCase("")) {
Log.e("SystemHelper", "Error with command: " + s);
return s;
}
sb = new StringBuffer();
BufferedReader br = new BufferedReader(
new InputStreamReader(process.getInputStream()));
while (br.ready()) {
sb.append(br.readLine()+"\n");
}
s = sb.toString();
if (!s.replaceAll(" ", "").equalsIgnoreCase("")) {
Log.e("`SystemHelper`", "Output from command: " + s);
return s;
}
return s;
} catch (IOException e) {
Log.e("SystemHelper", "Error executing: " + command, e);
}
return "";
}`public static String executeCommandSU( String command)
{
try {
Process process = new ProcessBuilder().command("su").start();
process.getOutputStream().write((command + "\n").getBytes("ASCII"));
//process.getOutputStream().write(("ls data" + "\n").getBytes("ASCII"));
process.getOutputStream().flush();
SystemClock.sleep(3000);
StringBuffer sb = new StringBuffer();
BufferedReader bre = new BufferedReader(
new InputStreamReader(process.getErrorStream()));
while (bre.ready()) {
sb.append(bre.readLine());
}
String s = sb.toString();
if (!s.replaceAll(" ", "").equalsIgnoreCase("")) {
Log.e("SystemHelper", "Error with command: " + s);
return s;
}
sb = new StringBuffer();
BufferedReader br = new BufferedReader(
new InputStreamReader(process.getInputStream()));
while (br.ready()) {
sb.append(br.readLine()+"\n");
}
s = sb.toString();
if (!s.replaceAll(" ", "").equalsIgnoreCase("")) {
Log.e("`SystemHelper`", "Output from command: " + s);
return s;
}
return s;
} catch (IOException e) {
Log.e("SystemHelper", "Error executing: " + command, e);
}
return "";
}`
`
您错误地使用了ready()。查看文档以了解原因。变化:
while (br.ready()) {
sb.append(br.readLine()+"\n");
}
到
while (true) {
String l = br.readLine();
if (l == null) // EOF
break;
sb.append(l+"\n");
}
对错误流执行相同的操作。
同时更改:
process.getOutputStream().write((command + "\n").getBytes("ASCII"));
至:
process.getOutputStream().write((command + "\nexit\n").getBytes("ASCII"));
没测试过。希望它有效。