2010-08-13 1 views
10

Я пытаюсь написать пакет (для win) и скрипт оболочки для linux для автоматизации событий key и touch на пользовательском интерфейсе Android. На данный момент в окна пакетного файла Я начинаю ADB оболочку для каждого события для напримерshell/batch scripting to direct commands to adb shell

: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 

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

Любая идея, как я могу это сделать в win batch и lin shell script?

ответ

10

Я не знаю много о пакетном сценарии или сценариев оболочки, но я был в состоянии быстро написать программу 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" 
+1

классный ответ, только небольшая ошибка, нить t не должна иметь область действия метода –

2

Другой путь заключается в следующем: ответ

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" 
+0

Только что реализовано вы используете командный файл. Вышеупомянутое работает в bash, но я не помню, как DOS обрабатывает продолжение строки. Может быть, это будет работать как есть? Точка с запятой - это все, что необходимо для выдачи нескольких команд для оболочки adb (которая зола IIRC) – Topher

8

Тофер является почти правильно.

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

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, потому что еще ADB выбросит ошибку, что слишком много аргументов.

+0

Спасибо. Ваш ответ помог мне. –

+0

@Vladimir, что делать, если мои команды оболочки содержат кавычки? Например, текст ввода команды adb shell "blah-blah" ' – stansult

10

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

adb shell < commands.txt 
6

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

(
    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