Android simula un barrido rápido

Estoy haciendo un script de automatización genérico.

Necesito enviar eventos complejos de deslizamiento a la pantalla de Android sin tener acceso específico a las aplicaciones enfocadas

Lo mejor que he pensado hasta ahora es usar adb, crear un archivo con comandos sendevent, insertarlo en el dispositivo y ejecutarlo desde allí. Incluso eso, es muy lento (mucho más lento en comparación con si lo grabo con getevent y lo devuelvo).

Logré optimizar el archivo ya que descubrí que cada bloque de evento de envío no requiere específicamente tanto X como Y, pero sigue siendo un número de órdenes de magnitud más lento

Ejemplo de parte del archivo (estoy probando un 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

Por lo tanto, mi objetivo es optimizar la velocidad de los barridos simples y complejos, no de los múltiples pequeños.

¿Alguien sabe de una mejor manera de hacer esto?

Por lo tanto, la idea de Chris Stratton funcionó en principio (volver a canalizar la salida de cat-gener genera el mismo deslizamiento con éxito), pero no puedo crear mi propio código para volver a incluirlo. Supongo que es algo que hacer con los separadores entre los comandos de envío de eventos ... pero todavía no puedo hacer que funcione

Usé una modificación del archivo sendevent.c para obtener un archivo con triples por línea y enviarlo a otro archivo. ¿Sabes cuál podría ser el problema? La conversión se ve bien ...

SOLUCIÓN: Logré resolverlo, principalmente gracias a las respuestas a continuación. Aquí hay una secuencia de comandos de C que toma un archivo con valores HEX y genera el archivo binario apropiado.

Uso: (para mí, el archivo del controlador táctil es / dev / input / event5 - HTC One - para otros dispositivos podría ser un archivo diferente!)

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

y la fuente:

#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;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta