Android simuliert schnelles Wischen

Ich mache ein generisches Automatisierungsskript.

Ich muss komplexe Wischereignisse an den Android-Bildschirm senden, ohne Zugriff auf die fokussierte (n) Anwendung (en) zu haben.

Der beste Weg, den ich bisher vermutet habe, ist, adb zu verwenden, eine Datei mit sendevent-Befehlen zu erstellen, sie auf das Gerät zu schieben und von dort aus auszuführen. Trotzdem ist es schmerzhaft langsam (viel langsamer als wenn ich es mit getevent aufnehme und wieder einpfeife).

Ich habe es geschafft, die Datei zu optimieren, da ich herausgefunden habe, dass jeder Sendevent-Block nicht speziell sowohl X als auch Y erfordert, aber immer noch einige Größenordnungen langsamer ist

Beispiel eines Teils der Datei (ich versuche es auf einem HTC One):

sendevent /dev/input/event5 3 57 49
sendevent /dev/input/event5 3 53 942
sendevent /dev/input/event5 3 54 2747
sendevent /dev/input/event5 0 0 0

sendevent /dev/input/event5 3 53 1207
sendevent /dev/input/event5 3 54 2483
sendevent /dev/input/event5 0 0 0

sendevent /dev/input/event5 3 53 1472
sendevent /dev/input/event5 0 0 0

sendevent /dev/input/event5 3 54 2218
sendevent /dev/input/event5 0 0 0

sendevent /dev/input/event5 3 53 1207
sendevent /dev/input/event5 3 54 2483
sendevent /dev/input/event5 0 0 0

sendevent /dev/input/event5 3 53 1472

Mein Fokus liegt daher auf der Optimierung der Geschwindigkeit einzelner langkomplexer Wischvorgänge, nicht mehrerer kleiner Wischvorgänge.

Kennt jemand einen besseren Weg, dies zu tun?

Die Idee von Chris Stratton funktionierte also im Prinzip (das erneute Umleiten der cat-ed-Ausgabe generiert den gleichen Swipe erfolgreich), aber ich kann keinen eigenen Code erstellen, um ihn wieder einzuleiten. Ich vermute, es ist etwas zu tun mit den Trennzeichen zwischen send event-Befehlen ... aber ich kann es immer noch nicht zum Laufen bringen

Ich habe eine Modifikation der Datei sendevent.c verwendet, um eine Datei mit Dreifachen pro Zeile zu erhalten und in eine andere Datei auszugeben. Wissen Sie zufällig, woran es liegen könnte? Die Konvertierung sieht gut aus ...

LÖSUNG: Ich habe es geschafft, vor allem dank der Antworten unten zu lösen. Hier ist ein C-Skript, das eine Datei mit HEX-Werten aufnimmt und die entsprechende Binärdatei ausgibt.

Verwendung: (Für mich ist die Touch-Treiber-Datei / dev / input / event5 - HTC One - für andere Geräte ist sie möglicherweise eine andere Datei !!!)

 
 $> adb shell getevent > tmp.in
 $> ./sendevent tmp.in tmp.out
 $> adb shell push tmp.out /mnt/sdcard/
 $> adb shell "cd /mnt/sdcard/ && cat tmp.out > /dev/input/event5"
gt; adb shell getevent > tmp.in
 $> adb shell getevent > tmp.in
 $> ./sendevent tmp.in tmp.out
 $> adb shell push tmp.out /mnt/sdcard/
 $> adb shell "cd /mnt/sdcard/ && cat tmp.out > /dev/input/event5"
gt; ./sendevent tmp.in tmp.out
 $> adb shell getevent > tmp.in
 $> ./sendevent tmp.in tmp.out
 $> adb shell push tmp.out /mnt/sdcard/
 $> adb shell "cd /mnt/sdcard/ && cat tmp.out > /dev/input/event5"
gt; adb shell push tmp.out /mnt/sdcard/
 $> adb shell getevent > tmp.in
 $> ./sendevent tmp.in tmp.out
 $> adb shell push tmp.out /mnt/sdcard/
 $> adb shell "cd /mnt/sdcard/ && cat tmp.out > /dev/input/event5"
gt; adb shell "cd /mnt/sdcard/ && cat tmp.out > /dev/input/event5"

und die Quelle:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <errno.h>

typedef uint32_t        __u32;
typedef uint16_t        __u16;
typedef __signed__ int  __s32;

__attribute__((aligned(1),packed)) struct input_event {
    __u32 time_dummy_1;
    __u32 time_dummy_2;
    __u16 type;
    __u16 code;
    __s32 value;
};

int convert (char * str) {
    return (int) strtol(str, NULL, 16);
}

#define S_ALL (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH)

int main (int argc, char *argv[]) {
    int i;
    int fd;
    int ret;

    if(argc < 3) {
        fprintf(stderr, "use: %s in-file out-file\n", argv[0]);
        return 1;
    }

    fd = open(argv[2], O_CREAT | O_WRONLY, S_ALL);
    if(fd < 0) {
        fprintf(stderr, "could not open %s, %s\n", argv[2], strerror(errno));
        return 1;
    }

    FILE * fd_in = fopen(argv[1], "r");
    if (fd_in == NULL) {
        fprintf(stderr, "Can't open input file: %s\n", argv[1]);
        return 1;
    }

    struct input_event event;
    char type[32];
    char code[32];
    char value[32];
    int count = 0;
    while (fscanf(fd_in, "%s %s %s", type, code, value) != EOF) {
        memset(&event, 0, sizeof(event));
        // printf("%d) %s %s %s\n", ++count, type, code, value);
        event.type = convert(type);
        event.code = convert(code);
        event.value = convert(value);
        memset(type, 0, sizeof(type));
        memset(code, 0, sizeof(code));
        memset(value, 0, sizeof(value));
        ret = write(fd, &event, sizeof(event));
        if(ret < sizeof(event)) {
            fprintf(stderr, "write event failed, %s\n", strerror(errno));
            return -1;
        }
    }

    return 0;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage