Как писать команды оболочки adb на Java

#java #sqlite #appium-android

#java #sqlite #appium-android

Вопрос:

Я хотел извлечь некоторый файл .db с устройства Android для тестирования автоматизации, для которого необходимо

  1. Откройте командную строку 2. введите команды оболочки adb, ниже приведены команды, которые я хотел написать в командной строке программно на JAVA,
 adb shell
run-as com.sk.shaft
cd files
cp file.db /sdcard/download/sample.db3
exit                               
exit                              
adb pull /sdcard/download/sample.db3 C:/users/libin/desktop/sample.db
 

До сих пор я могу открыть командную строку, но я не могу ввести вышеуказанные команды в командной строке.

 public class DBExtract {

    public static void main(String[] args) throws IOException {

Process process= Runtime.getRuntime().exec("cmd /c start cmd.exe /k ");
}
}
 

кто-нибудь может подсказать, пожалуйста?

Ответ №1:

Запустите несколько команд. При открытии cmd окна вы теряете контроль над ним. Вы можете создать пакетный скрипт, запустить его в новом cmd окне и перенаправить ввод.

Вы можете передать пакетный скрипт после /k параметра cmd.exe . В командном файле вы можете использовать перенаправление из batch.

На самом деле вы выполняете две команды. adb shell это одна команда, а adb pull это другая. Чтобы выполнить «подкоманды» в оболочке из adb, используйте process.getOutputStream() , создайте OutputStreamWriter на ней и запишите в нее команды.

Итак, создайте процесс для оболочки adb, перенаправьте текст на вход программы, а затем используйте adb pull в другом процессе.

Если вы хотите увидеть результат выполнения команд, используйте Process#getInputStream .

Программа может выглядеть следующим образом:

 public class DBExtract {

    public static void main(String[] args) throws IOException {
        Process process= Runtime.getRuntime().exec("adb shell");
        try(PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(process,getOutputStream(),StandardCharsets.UTF_8)))){
            pw.println("run-as com.sk.shaft");
            pw.println("cd files");
            pw.println("cp file.db /sdcard/download/sample.db3");
            pw.println("exit");
            pw.println("exit");
        }
        process=Runtime.getRuntime().exec("adb pull /sdcard/download/sample.db3 C:/users/libin/desktop/sample.db");
    }
}
 

Комментарии:

1. да, это так, теперь он открыл оболочку adb, но другие команды не выполняются, т. е. Отсюда run-as com.sk.shaft cd files cp file.db /sdcard/download/sample.db3 exit exit.

2. Вам нужно отправить эти команды в качестве входных adb shell данных команды, используя перенаправление ввода ( process.getOutputStream() ) (Я отредактировал свой ответ)