android 编码 java excute su 命令 android 不工作

问题描述 投票:0回答:1

我有一个通过 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 "";
    }`

`

java android terminal su
1个回答
0
投票

您错误地使用了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"));

没测试过。希望它有效。

© www.soinside.com 2019 - 2024. All rights reserved.