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シェルスクリプトでこれを行う方法はありますか?
バッチスクリプトやシェルスクリプトについてはよくわかりませんが、これを行うための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行に1つずつ入れてから、次のコマンドを実行します。
adb Shell < commands.txt
トファーの答えはほぼ正しいです。
改行を削除するだけで機能します。
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がエラーをスローし、引数が多すぎるなどです。 。
私は似たようなことをしています
(
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"