2010-08-13 32 views
10

Tôi đang cố gắng viết một lô (để giành chiến thắng) và một kịch bản lệnh shell cho Linux để tự động hóa các sự kiện quan trọng và cảm ứng trên giao diện người dùng Android. Tại thời điểm trong tệp loạt cửa sổ, tôi bắt đầu một vỏ adb cho mỗi sự kiện cho ví dụ:shell/batch scripting để chuyển lệnh đến 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 

Mã trên là không bắt đầu một vỏ adb mới mỗi lần. Tôi muốn tránh điều này. Tôi muốn tập lệnh batch của mình chỉ bắt đầu shell adb một lần và tôi muốn định tuyến các lệnh gửi và các lệnh khác tới subshell, tức là shell adb.

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này trong chuỗi chiến thắng và tập lệnh shell Lin?

Trả lời

10

Tôi không biết nhiều về kịch bản hàng loạt hoặc kịch bản vỏ, nhưng tôi đã có thể nhanh chóng viết một chương trình java để làm điều này:

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

Sau đó bạn có thể sử dụng lớp này trong một kịch bản shell như bạn giống như truyền các lệnh để thực hiện như các đối số dòng lệnh trong phương thức chính của bạn.

ví dụ: Dưới đây là kịch bản 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

câu trả lời thú vị, chỉ là lỗi nhỏ, Chủ đề t không nên có phạm vi phương thức –

2

Một cách khác để đi như sau: Câu trả lời

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

Chỉ cần thực hiện bạn đang sử dụng một tập tin thực thi. Các công trình trên bash nhưng tôi không nhớ làm thế nào DOS xử lý dòng tiếp tục. Có lẽ điều này sẽ làm việc như-là? Các dấu chấm phẩy là tất cả những gì cần thiết để phát hành nhiều lệnh cho adb shell (là tro IIRC) – Topher

8

Topher là gần như chính xác.

Chỉ cần xóa các dòng mới và nó sẽ hoạt động.

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

Điều duy nhất bạn cần phải chăm sóc là, bạn không ăn ở hơn 25 (là số tiền tôi đã sử dụng, 30 công việc doesn nữa) sendevents, bởi vì khác adb sẽ ném lỗi, mà có quá nhiều lý lẽ.

+0

Cảm ơn. Câu trả lời của bạn đã giúp tôi. –

+0

@Vladimir, nếu lệnh shell của tôi bao gồm dấu ngoặc kép thì sao? Ví dụ: Ví dụ: "adb shell input text" blah-blah "' – stansult

10

Đặt tất cả các lệnh bạn muốn chạy cùng một lúc trong một tập tin bên ngoài, mỗi dòng một, sau đó chạy:

adb shell < commands.txt 
6

Tôi đang làm một cái gì đó tương tự

(
    echo cd sdcard 
    echo ls 
) | adb shell 

Vì vậy, nó có thể làm việc như bên dưới:

(
    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 
Các vấn đề liên quan