Android симулирует быстрое перелистывание

Я делаю общий сценарий автоматизации.

Мне нужно отправлять сложные события смахивания на экран Android без специального доступа к целевым приложениям

Лучший способ, который я до сих пор считал, это использовать adb, создать файл с командами sendevent, вставить его на устройство и запустить его оттуда. Тем не менее, это мучительно медленно (гораздо медленнее, чем если бы я записал его с помощью getevent и вернул обратно).

Мне удалось оптимизировать файл, так как я выяснил, что для каждого блока отправлений не требуются X и Y, но он все же на несколько порядков медленнее

Пример части файла (я пытаюсь на 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

Таким образом, моя задача - оптимизировать скорость одиночных длинных сложных ударов, а не нескольких маленьких.

Кто-нибудь знает лучший способ сделать это?

Итак, идея Криса Страттона сработала в принципе (повторная отправка вывода cat-ed приводит к тому же удару), но я не могу создать свой собственный код, чтобы передать его обратно. Я предполагаю, что это нужно сделать с разделителями между командами отправки события ... но я все еще не могу заставить его работать

Я использовал модификацию файла sendevent.c, чтобы получить файл с тройками на строку и вывести его в другой файл. Вы случайно не знаете, в чем может быть проблема? Конверсия выглядит хорошо ...

SOLLUTION: мне удалось решить эту проблему, в основном благодаря ответам ниже. Вот скрипт C, который принимает файл со значениями HEX и выводит соответствующий двоичный файл.

Использование: (для меня файл сенсорного драйвера - / dev / input / event5 - HTC One - для других устройств это может быть другой файл !!!)

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

и источник:

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

Ответы на вопрос(2)

Ваш ответ на вопрос