我正在做一個通用的自動化腳本。Android模擬快速刷卡
我需要複雜的刷卡事件發送到Android屏幕而不特別是具有訪問焦點應用(一個或多個)
我想通到目前爲止最好的辦法是使用ADB,創建的SendEvent命令的文件,將其推在設備上並從那裏運行。即使如此,它的速度卻非常緩慢(如果我用getevent記錄並重新輸入它,速度要慢得多)。
我設法優化文件,因爲我想出每個的SendEvent塊沒有特別要求X和Y,但它仍然是大小較慢的文件的一部分
實施例的幾個數量級(I」米試穿的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
所以我的重點是優化而不是多個小的單長複雜的揮動速度。
任何人都知道更好的方法來做到這一點?
所以,克里斯·斯特拉頓的想法原則上工作(重新管道貓-ED輸出成功生成相同的刷卡),但我不能夠創建自己的代碼來管回。我猜測這是與發送事件命令之間的分隔符...但我仍然無法讓它工作
我使用了sendevent.c文件的修改來獲取每行三元文件和輸出到另一個文件。你碰巧知道可能是什麼問題?轉換看起來不錯...
SOLLUTION:我設法解決它,主要得益於下面的答案。這是一個C腳本,它接受一個具有HEX值的文件並輸出相應的二進制文件。
用法:(對我來說,觸摸驅動程序文件是/ dev /輸入/ 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"
和源:
#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;
}
我知道這是一個老問題,但你將能夠解釋如何將這個新的sendevents.c文件放到android設備上,我推測你會使用adb push,但不知道我可以將文件放在哪個目錄下,以便它是可執行文件。 –
我現在已經創建了一個更合適的問題。你的幫助將不勝感激。 http://stackoverflow.com/questions/23131081/adding-a-custom-tool-to-the-android-adb-shell –
我發佈了你的問題的答案。希望它有助於:http://stackoverflow.com/questions/23131081/adding-a-custom-tool-to-the-android-adb-shell/23135779#23135779 – Stefan