Можно ли выполнять команды 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»