Скрипты Shell / Batch для прямых команд для оболочки ADB

StackOverflow https://stackoverflow.com/questions/3474318

  •  28-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать партию (для Win) и сценарий оболочки для Linux для автоматизации клавиш и сенсорных событий на Android-интерфейсе. На данный момент в файле пакет Windows я запускаю оболочку ADB для каждого события, например,

    :again

adb shell am start -a android.intent.action.MAIN -n com.q.me.fui.activity/.InitActivity

sleep 15

adb shell sendevent /dev/input/event0 3 0 281
adb shell sendevent /dev/input/event0 3 1 70
adb shell sendevent /dev/input/event0 1 330 1
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 1 330 0
adb shell sendevent /dev/input/event0 0 0 0   
adb shell sendevent /dev/input/event0 1 330 1
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 1 330 0
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 0 0 0   

sleep 5

adb shell input keyevent 82
adb shell input keyevent 20
adb shell input keyevent 20
adb shell input keyevent 22
adb shell input keyevent 22
adb shell input keyevent 22
adb shell input keyevent 66

sleep 5

goto again

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

Любая идея, как я могу сделать это в Win Patch и Lin Shell Scrept?

Это было полезно?

Решение

Я не знаю много о сценарии пакетных скриптов или Shell, но я смог быстро написать программу Java, чтобы сделать это:

import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

public class AndroidShell  {
   private ProcessBuilder builder;
   private Process adb;
   private static final byte[] LS = "\n".getBytes();

   private OutputStream processInput;
   private InputStream processOutput;

   private Thread t;

   /**
    * Starts the shell 
    */
   public void start() throws IOException  {
      builder = new ProcessBuilder("adb", "shell");
      adb = builder.start();

      // reads from the process output
      processInput = adb.getOutputStream();

      // sends to process's input
      processOutput = adb.getInputStream();

      // thread that reads process's output and prints it to system.out
      Thread t = new Thread() {
         public void run() {
            try   {
               int c = 0;
               byte[] buffer = new byte[2048];
               while((c = processOutput.read(buffer)) != -1) {
                     System.out.write(buffer, 0, c);
               }
            }catch(Exception e)  {}
         }
      };
      t.start();
   }

   /**
    * Stop the shell;
    */
   public void stop()   {
      try   {
         if(processOutput != null && t != null) {
            this.execCommand("exit");
            processOutput.close();
         }
      }catch(Exception ignore)  {}
   }

   /**
    * Executes a command on the shell
    * @param adbCommand the command line.
    * e.g. "am start -a android.intent.action.MAIN -n com.q.me.fui.activity/.InitActivity" 
    */
   public void execCommand(String adbCommand) throws IOException {
      processInput.write(adbCommand.getBytes());
      processInput.write(LS);
      processInput.flush();
   }

   public static void main(String[] args) throws Exception  {
      AndroidShell shell = new AndroidShell();
      shell.start();

      for(String arg : args)  {
         if(arg.startsWith("sleep"))   {
            String sleep = arg.split(" ")[1].trim();
            long sleepTime = Integer.parseInt(sleep) * 1000;
            Thread.sleep(sleepTime);
         }else {
            shell.execCommand(arg);
         }
      }

      shell.stop();
   }
}

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

Например, ниже скрипт оболочки:

#!/bin/bash

java AndroidShell "am start -a android.intent.action.MAIN -n com.q.me.fui.activity/.InitActivity" \
"sleep 15" \
"sendevent /dev/input/event0 3 0 281" \
"sendevent /dev/input/event0 3 1 70" \
"sendevent /dev/input/event0 1 330 1" \
"sendevent /dev/input/event0 0 0 0" \
"sleep 10" \
"sendevent /dev/input/event0 1 330 0" \
"exit"

Другие советы

Поместите все команды, которые вы хотите запустить сразу во внешнем файле, по одному на строку, затем запустите:

adb shell < commands.txt

Ответ Topher практически правильный.

Просто удалите новые линии, и это будет работать.

adb shell "sendevent /dev/input/event9 3 53 215;sendevent /dev/input/event9 3 54 68;sendevent /dev/input/event9 3 48 40;sendevent /dev/input/event9 3 50 6;sendevent /dev/input/event9 3 57 0;sendevent /dev/input/event9 0 2 0;sendevent /dev/input/event9 0 0 0;sendevent /dev/input/event9 3 53 215;sendevent /dev/input/event9 3 54 68;sendevent /dev/input/event9 3 48 0;sendevent /dev/input/event9 3 50 6;sendevent /dev/input/event9 3 57 0;sendevent /dev/input/event9 0 2 0;sendevent /dev/input/event9 0 0 0;"

Единственное, что вам нужно позаботиться о том, что вы не кормите в более чем 25 (это сумма, которую я использовал, 30 не работает) SendEvents, потому что else adb бросит ошибку, что слишком много аргументов или около того Отказ

Я делаю что-то подобное

(
   echo cd sdcard
   echo ls
) | adb shell

Так что это может работать ниже:

(
    echo am start -a android.intent.action.MAIN -n com.q.me.fui.activity/.InitActivity
    echo sleep 15
    echo sendevent /dev/input/event0 3 0 281
    echo sendevent /dev/input/event0 3 1 70
    echo sendevent /dev/input/event0 1 330 1
    echo sendevent /dev/input/event0 0 0 0
    echo sendevent /dev/input/event0 1 330 0
    echo sendevent /dev/input/event0 0 0 0   
    echo sendevent /dev/input/event0 1 330 1
    echo sendevent /dev/input/event0 0 0 0
    echo sendevent /dev/input/event0 1 330 0
    echo sendevent /dev/input/event0 0 0 0
    echo sendevent /dev/input/event0 0 0 0
    echo sendevent /dev/input/event0 0 0 0   
    echo sleep 5
    echo input keyevent 82
    echo input keyevent 20
    echo input keyevent 20
    echo input keyevent 22
    echo input keyevent 22
    echo input keyevent 22
    echo input keyevent 66
    echo sleep 5
) | adb shell

Еще один способ пойти следующий:

adb shell "sendevent /dev/input/event0 3 0 281;
           sendevent /dev/input/event0 3 1 70;
           sendevent /dev/input/event0 1 330 1;
           sendevent /dev/input/event0 0 0 0;
           sendevent /dev/input/event0 1 330 0;
           sendevent /dev/input/event0 0 0 0;
           sendevent /dev/input/event0 1 330 1;
           sendevent /dev/input/event0 0 0 0;
           sendevent /dev/input/event0 1 330 0;
           sendevent /dev/input/event0 0 0 0;
           sendevent /dev/input/event0 0 0 0;
           sendevent /dev/input/event0 0 0 0"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top