Android simuler rapide de balayage
Je suis en train de faire un générique de script d'automatisation.
J'ai besoin d'envoyer complexe de balayage des événements à l'écran android sans avoir spécifiquement l'accès à la demande(s)
Meilleure façon que j'ai compris jusqu'à présent est d'utiliser de la bad, de créer un fichier avec sendevent commandes, appuyez sur l'appareil et exécuter à partir de là. Encore que, il est très lent (beaucoup plus lent par rapport à si j'enregistre avec getevent et le tuyau de retour dans).
J'ai réussi à optimiser le fichier depuis j'ai compris que chaque sendevent bloc n'exige pas expressément à la fois X et Y, mais il est encore quelques ordres de grandeur inférieure à
Exemple de la partie du fichier (je vais essayer sur 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
Donc, mon objectif est d'optimiser la vitesse de simples de longue complexe glisse, pas de multiples petits.
Quelqu'un sait d'une meilleure façon de le faire?
Donc, Chris Stratton idée travaillé en principe (remplacement de la tuyauterie, le chat-ed génère le même balayage avec succès), mais je ne peux pas être en mesure de créer mon propre code pour la pipe. Je suppose que c'est quelque chose à voir avec les séparateurs entre les envoyer événement commandes... mais je ne peux toujours pas le faire fonctionner
J'ai utilisé une modification de la sendevent.c fichier pour obtenir un fichier avec des triples par ligne et sortie vers un autre fichier. Savez-vous ce que pourrait être le problème? La Conversion semble bon ...
SOLUTION: j'ai réussi à le résoudre, surtout grâce aux réponses ci-dessous. Voici un C un script qui prend un fichier avec les valeurs hexadécimales et les sorties de l'appropriées fichier binaire.
Utilisation: (pour moi, le toucher fichier de pilote est /dev/input/event5 - HTC One - pour les autres appareils, il peut être un autre fichier !!!)
$> 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"
et la source:
#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;
}
J'ai maintenant créé une question qui est plus approprié. votre aide serait appréciée. stackoverflow.com/questions/23131081/...
J'ai posté une réponse à votre question. Espérons que cela aide: stackoverflow.com/questions/23131081/...
OriginalL'auteur Stefan | 2013-09-28
Vous devez vous connecter pour publier un commentaire.
Veuillez noter que cette réponse vise circa-2013 versions d'Android et peuvent ne pas s'appliquer à l'actuel. Jellybean était contemporaines à la fois, Kitkat est sorti quelques semaines après que la question a été posée
Votre retard est probablement le résultat de façon inefficace avoir à plusieurs reprises le lancement d'une nouvelle
sendevent
processus, d'analyser le texte d'enregistrement d'événement, et ouvrez le nœud de périphérique - pour chaque événement. Si vous au lieu de tout faire, de l'intérieur d'un seul processus, l'ouverture de l'appareil de fichier qu'une seule fois, il sera beaucoup plus efficace.Si l'on regarde la source pour sendevent dans la boîte à outils contemporain avec la date de la question (par exemple, https://android.googlesource.com/platform/system/core/+/jb-release/boîte à outils/sendevent.c ), nous voyons que le cœur de ce qu'est en train de faire est de codage de l'ensemble des événements dans des enregistrements binaires
et de les écrire sur le périphérique approprié
À condition que vous êtes l'exécution de quelque chose que l'
shell
nom d'utilisateur ou un autre dans leinput
groupe unix, vous devriez être en mesure de faire la même chose quesendevent
fait à partir de votre propre programme personnalisé, ou en utilisant d'autres outils en ligne de commande commecat
, ainsi efficacement en poussant un binaire fichier d'enregistrements d'événements.Par exemple
Faire un peu de toucher les événements de l'écran, puis ctrl-C pour tuer chat
Maintenant, vous pouvez lire le fichier capturé binaire des événements:
(Note: sendevent est mise à zéro du
timeval
partie de chaque enregistrement, l'enregistrement et la lecture peut ne pas le faire; vous aurez à le voir, et si elle les questions de zéro ces portions de chaque enregistrement dans le fichier avant de l'écrire)il fonctionne presque, pouvez-vous s'il vous plaît regardez sur mon post mis à jour, peut-être que vous savez quel est le problème
alors que je ne sais pas si c'est votre seul problème, on dirait que vous êtes en utilisant les spécificateurs de format pour une
int
ie "%d", mais en passant un pointeur vers un __u16 (qui est effectivement ununsigned short
) à fscanf. Vous voulez probablement "%hu", ou au contraire de le lire dans un temporaire unsigned int, puis de la copier.ok, changé, mais toujours aucun effet. Pas sûr de savoir comment il est significatif, mais pour un aléatoire complexe de balayage si je l'enregistre avec le chat ... | wc il donne: 52 301 8640 en parallèle j'ai également enregistrer la bad getevent de sortie, convertir les valeurs en base 10 et de l'exécuter ./sendevent après quoi, le résultat est: 0 11 7704 Le nombre d'événements enregistrés avec sendevent est de 321 qui est assez proche du nombre de mots signalés par les wc c'est pourquoi (et aussi le fait que la mine n'a pas de lignes) je pense que ça a surtout à voir avec une sorte de séparateur ainsi
Essayez d'exécuter à la fois sur votre machine de dev à l'encontre d'un fichier régulier cible et hexdumping les sorties à comparer. Ou il suffit de comparer votre entrée à la hexdump de la sortie.
OriginalL'auteur
Si vous voulez juste pour produire linéaire de glisse, vous pouvez utiliser
input swipe
commande shell.De commande ci-dessous trace une belle ligne pour moi dans une application de dessin
et rapidement un
vous avez un accès root?
Je ne pense pas que l'accès à la racine sera nécessaire. Cela semble être utilisable à partir de la commande adb shell, ce qui signifie la
shell
nom d'utilisateur a la permission de faire tout ce qui est nécessaire. L'entrée de commande est un script qui utilise l'app-processus de lancement input.java (non officiel repo github.com/android/platform_frameworks_base/blob/master/cmds/... ) qui pourrait sans doute être remplacé par une version personnalisée de la même façon compilées et stockées. Et de même invoqué de la commande adb shell - vous ne serait pas en mesure de le faire à partir d'une application à avoir pour contourner le modèle de sécurité.Malheureusement pas. Être sous-répertoire system de faire cette demande de parler à des composants autrement pas possible. Vous ne pouvez même pas construire l'application à l'extérieur d'un Android référentiel, car il utilise caché Api.
Hé les gars. Pour répondre à une question précédente: je n'ai pas de racine encore (je ne pense pas qu'il y en a un encore pour HTC One). Actuellement, je suis seulement en cours d'exécution à partir d'une application sur mon mac, j'appuie sur le fichier de script avec tous les envoyer des événements à l'appareil et je le lance à partir de là et il fonctionne très bien. J'ai essayé d'utiliser la commande adb shell et chat-ing dans /dev/input/event5 (c'est ma événements tactiles) et cela a fonctionné. Vérifiez la mise à la poste ^^
OriginalL'auteur