2010-08-13 4 views
10

J'essaye d'écrire un batch (pour win) et un script shell pour Linux pour automatiser les événements key et touch sur une interface utilisateur android. À l'heure actuelle dans un fichier batch windows je commence une adb shell pour chaque événement pour exemplescript shell/batch pour diriger les commandes vers le shell 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 

Le code ci-dessus est enfait lance un nouveau shell adb à chaque fois. Je veux éviter cela. Je veux que mon script batch démarre le shell adb une seule fois et que je souhaite router les commandes sendevent et autres vers le sous-shell, c'est-à-dire le shell adb. Une idée de comment je peux le faire dans un batch batch et un script shell Lin?

Répondre

10

Je ne sais pas beaucoup sur les scripts de traitement par lots ou scripts shell, mais je suis capable d'écrire rapidement un programme java pour ce faire:

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(); 
    } 
} 

Vous pouvez ensuite utiliser cette classe dans un script shell que vous comme passer les commandes à exécuter en tant qu'arguments de ligne de commande dans votre méthode principale.

par exemple. Ci-dessous le script shell:

#!/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

réponse cool, juste petite erreur, le fil t ne devrait pas avoir la portée de la méthode –

2

Une autre façon de faire est la suivante: la réponse de

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

viens juste de réaliser vous utilisez un fichier batch. Ce qui précède fonctionne dans bash mais je ne me souviens pas comment DOS gère la continuation de la ligne. Peut-être que cela fonctionnera tel quel? Les points-virgules sont tout ce qui est nécessaire pour exécuter plusieurs commandes à shell ADB (qui est cendres IIRC) – Topher

8

Topher est presque correcte.

Supprimez simplement les nouvelles lignes et cela fonctionnera.

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;" 

La seule chose que vous devez prendre soin de est que vous ne nourrissez pas plus de 25 (ce qui est le montant que j'utilisé, 30 travail doesn plus) sendEvents, parce que d'autre adb va jeter l'erreur, que il y a trop d'arguments ou autres.

+0

Merci. Votre réponse m'a aidé. –

+0

@Vladimir, que se passe-t-il si mes commandes shell incluent des guillemets? Par exemple, 'texte d'entrée du shell adb" blah-blah "' – stansult

10

Mettez toutes les commandes que vous souhaitez exécuter à la fois dans un fichier externe, un par ligne, puis exécutez:

adb shell < commands.txt 
6

Je suis en train de faire quelque chose de similaire

(
    echo cd sdcard 
    echo ls 
) | adb shell 

Il peut travailler ci-dessous:

(
    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 
Questions connexes