Можно ли выполнять команды ADB через мое приложение для Android?

Может кто-нибудь сказать, будь adb Команды могут быть выполнены через мое приложение для Android. Если можно выполнить, как это можно реализовать?

7 ответов

Решение

Вы можете сделать это с этим:

Process process = Runtime.getRuntime().exec("your command");
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));

Не забудьте окружить его выражением "попробуй и поймай".

Редактировать:

@ Фикс прав, лучше использовать ProcessBuilder.

Обычные приложения Android имеют разные права доступа к процессам, запущенным через adbНапример, процессы начались через adb разрешены для захвата экрана, в то время как обычные приложения нет. Таким образом, вы можете выполнять команды из вашего приложения через Runtime.getRuntime().exec(), но они не будут иметь такие же привилегии, как если бы вы казнили с adb shell,

Я наткнулся на этот пост в поисках другого запроса, но я специально работал с input на Android раньше, так что я бы хотел внести ясность в этот вопрос.

Причина по которой

Runtime.getRuntime().exec("adb shell input keyevent 120");    

Не работает, потому что вы не удаляете

adb shell   

ADB Эта часть предназначена только для использования на вашем компьютере, если вы неправильно установили ADB, команда на самом деле будет путь к файлу adb.exe на вашем компьютере, как это

C:\XXXX\ADB Files\adb.exe shell    

или же
C:\XXXX\ADB Files\adb shell

shell часть сообщает программе ADB на вашем компьютере, что нужно получить доступ к оболочке устройства, поэтому ваше устройство не будет знать, что такое оболочка...

С помощью sh /path/to/commandList.sh выполнит запятые, перечисленные в commandList.sh, так как это сценарий оболочки (файл.batch в Windows похож)

Команда, которую вы хотите использовать

Runtime.getRuntime().exec("input keyevent 120");     

Однако это приведет к тому, что Environment будет иметь значение null, а рабочий каталог станет пустым. Это можно обойти, записав команды в сценарий оболочки (файл.sh), а затем запустив сценарий с

Runtime.getRuntime().exec("sh path/to/shellScript.sh");   

Иногда sh не нужен, но я использую его только в случае.

Надеюсь, это прояснит хоть что-нибудь до:)

Это то, что я делаю в Котлине, я также получаю ответы на команды

      fun runShellCommand(command: String) {
    // Run the command
    val process = Runtime.getRuntime().exec(command)
    val bufferedReader = BufferedReader(
        InputStreamReader(process.inputStream)
    )

    // Grab the results
    val log = StringBuilder()
    var line: String?
    line = bufferedReader.readLine()
    while (line != null) {
        log.append(line + "\n")
        line = bufferedReader.readLine()
    }
    val Reader = BufferedReader(
        InputStreamReader(process.errorStream)
    )

    // if we had an error during ex we get here
    val error_log = StringBuilder()
    var error_line: String?
    error_line = Reader.readLine()
    while (error_line != null) {
        error_log.append(error_line + "\n")
        error_line = Reader.readLine()
    }
    if (error_log.toString() != "")
        Log.info("ADB_COMMAND", "command : $command $log error $error_log")
    else
        Log.info("ADB_COMMAND", "command : $command $log")
}

Оболочка adb, вызываемая в Runtime.getRuntime().exec не работает под пользователем оболочки. Это обеспечивает оболочку, но с тем же пользователем владельца процесса (как u0_a44). Вот почему вся команда не работает.

Проведение

Runtime.getRuntime().exec("adb shell input keyevent 120");

Я получил следующую ошибку: java.io.IOException: Невозможно запустить программу "adb": ошибка =13, Отказано в доступе.

проведение

Runtime.getRuntime().exec("adb shell input keyevent 120");

Там нет ошибки, но в то же время, мой запрос не обрабатывается, чтобы сделать снимок экрана.

Я узнал, что это работало в более ранних версиях Android, но позже это было удалено. Хотя я не могу предоставить источник здесь, почему он не работает.

Надеюсь, что это поможет кому-то вроде меня, который пытается использовать этот подход, чтобы сделать снимок экрана, когда приложение не на переднем плане.

      Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
string cmd = "/system/bin/input keyevent 23\n";
os.writeBytes(cmd);

телефон должен быть рутирован. здесь я выполнил команду adb «input keyevent 23». помните, когда вы выполняете команду adb через su, вам не нужно добавлять «adb shell input keyevent 23»

Другие вопросы по тегам