[英]shell/ batch scripting to direct commands to adb shell
我正在嘗試編寫一個批處理(for win)和一個用於linux的shell腳本,以便在Android UI上自動執行鍵和觸摸事件。 在Windows批處理文件中,我正在為每個事件啟動一個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
上面的代碼每次都會啟動一個新的adb shell。 我想避免這種情況。 我希望我的批處理腳本只啟動一次adb shell,我想將sendevent和其他命令路由到子shell,即adb shell。
知道我怎么能在win batch和Lin shell腳本中做到這一點?
將所有要在一個外部文件中運行的命令放在一個外部文件中,每行一個,然后運行:
adb shell < commands.txt
Topher的答案幾乎是正確的。
只需刪除換行符即可。
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會拋出錯誤,有太多的參數左右。
我不太了解批處理腳本或shell腳本,但我能夠快速編寫一個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();
}
}
然后,您可以在shell腳本中使用此類,因為您希望將命令作為主方法中的命令行參數執行。
例如,下面是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"
我正在做類似的事情
(
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.