web-dev-qa-db-ja.com

コマンドをadbシェルに送信するためのシェル/バッチスクリプト

Android UIでキーイベントとタッチイベントを自動化するために、Linux用のバッチ(win用)とシェルスクリプトを作成しようとしています。現在、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シェルを1回だけ開始し、sendeventおよびその他のコマンドをサブシェル(adbシェル)にルーティングしたいと思います。

ウィンバッチとLinシェルスクリプトでこれを行う方法はありますか?

10
Harkish

バッチスクリプトやシェルスクリプトについてはよくわかりませんが、これを行うための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"
10
naikus

一度に実行するすべてのコマンドを外部ファイルに1行に1つずつ入れてから、次のコマンドを実行します。

adb Shell < commands.txt
16
Drealmer

トファーの答えはほぼ正しいです。

改行を削除するだけで機能します。

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はもう機能しません)。そうしないと、adbがエラーをスローし、引数が多すぎるなどです。 。

10
Vladimir S.

私は似たようなことをしています

(
   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
6
Stkabi

別の方法は次のとおりです。

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"
2
Topher