用于将命令定向到adb shell的shell / batch脚本

我正在尝试编写一个批处理(用于获胜)和一个用于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脚本中做到这一点?

    我不太了解批量脚本或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. * eg "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" 

    将所有要在一个外部文件中运行的命令放在一个外部文件中,每行一个,然后运行:

     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将抛出错误,有太多的参数左右。

    我正在做类似的事情

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