Grundlagen¶
Dieses Kapitel führt Sie in die Grundlagen der Android-Automatisierung ein. Bitte lesen Sie die Beschreibungen in diesem Kapitel sorgfältig durch, da sie später nicht wiederholt werden. Die Android-Automatisierung unterscheidet sich erheblich von der herkömmlichen Web-Automatisierung, weist aber auch viele Gemeinsamkeiten auf. Bei der herkömmlichen Web-Automatisierung können Sie das Layout der Webseite und Informationen wie Element-IDs einfach mit den F12-Entwicklertools einsehen und dann XPATH verwenden, um Elemente für Klicks, Wartezeiten und andere Operationen zu erhalten. In Android ist die Logik ähnlich; Sie können auch etwas namens Selektor verwenden, um Elemente auszuwählen und Operationen wie Klicks und Überprüfungen durchzuführen, sodass Sie sich keine Sorgen über eine steile Lernkurve machen müssen.
Gemeinsamkeiten und Unterschiede zwischen Mobil- und Web-Automatisierung¶
Die Automatisierung auf mobilen Geräten und im Web hat viele Gemeinsamkeiten, aber auch viele Unterschiede. Nehmen wir Selenium als Beispiel. Normalerweise benötigen Sie für die Steuerung einer Webseite mit Selenium drei Dinge: erstens einen Browser, zweitens einen WebDriver und drittens Selenium. Das Gleiche gilt für mobile Geräte: Das Mobiltelefon entspricht dem Browser, FIRERPA entspricht dem WebDriver und die Python-Bibliothek von FIRERPA, also lamda, entspricht Selenium. Ihr Ziel ist dasselbe: die Simulation von Benutzeraktionen zur Durchführung von Tests, zur Datenerfassung oder zur automatischen Ausführung von Aufgaben. Beide werden durch Skripte gesteuert und führen Operationen wie das Lokalisieren von Elementen, Klicken, Erstellen von Screenshots und Überprüfungen durch. So gesehen sind sie sich doch recht ähnlich.
Aber sie sind auch unterschiedlich. Zunächst einmal benötigen Sie für die mobile Automatisierung ein Mobiltelefon und einen Computer, während die Web-Automatisierung auf Ihrem eigenen Computer durchgeführt werden kann. Außerdem verwenden sie nicht denselben Ansatz. Für das Web sind gängige Werkzeuge Selenium, Puppeteer und Playwright. Für mobile Geräte sind es in der Regel FIRERPA, AutoJS, Appium, uiautomator und ähnliche.
Im Web basieren die gängigen Lokalisierungsmethoden hauptsächlich auf der HTML-DOM-Struktur mit xpath oder csspath, und die Elementhierarchie ist relativ intuitiv. Auf mobilen Geräten sind die gängigen Lokalisierungsmethoden Selektoren. Natürlich verwenden auch Android-Anwendungsoberflächen XML-Layouts, sodass Sie auch xpath für XML verwenden können. In der Regel müssen Sie sich bei der Web-Automatisierung nicht allzu viele Gedanken über Kompatibilitätsprobleme machen; in den meisten Fällen können Sie die meisten gerätebedingten Kompatibilitätsprobleme umgehen, indem Sie einen festen Browser und eine feste Startauflösung verwenden. Bei Android können jedoch verschiedene Marken und Modelle von Geräten, Bildschirmgrößen, Systemversionen usw. die Kompatibilität des Automatisierungscodes beeinträchtigen. Aber keine Angst, der Einfluss ist zwar vorhanden, aber nicht groß.
Unterschiede zwischen verschiedenen Automatisierungstools¶
Wie oben erwähnt, gibt es auch viele Unterschiede zwischen den verschiedenen gängigen Automatisierungstools für Android, die wir als Beispiele aufgeführt haben. Wir möchten unseren Standpunkt klarstellen: FIRERPA ist das stabilste, funktionsreichste, leistungsstärkste und am besten für das Projektmanagement und die Anwendung geeignete Automatisierungstool von allen.
Notiz
AutoJS¶
Gängige Produkte wie AutoJS und seine Derivate gehören zur Kategorie der Selbststeuerung. Sie erfordern die Installation einer APK auf dem Gerät und die Verwendung von JS-Skripten für die Bedienung. Normalerweise kann AutoJS nur Operationen auf Automatisierungsebene durchführen. Der Vorteil ist, dass es für Anfänger oder den Hobbygebrauch geeignet ist und eine niedrige Einstiegshürde hat. Sein Design ist jedoch nicht für die Steuerung, Verwaltung und Aktualisierung von Skripten in großem Maßstab geeignet. Es ist dezentralisiert und befindet sich in einem unkontrollierten Zustand, was eine präzise Steuerung in großem Maßstab unmöglich macht.
Appium¶
Appium, das häufig von Testern verwendet wird, hat eine C/S-Architektur und ist im Vergleich zu AutoJS besser für die Cluster-Steuerung geeignet. Es hat jedoch offensichtliche Nachteile. Da es für die Automatisierung der meisten Systeme geeignet ist und neben Android auch iOS unterstützt, ist es groß und aufgebläht, was es für den Einsatz in großem Maßstab sehr ungeeignet macht.
u2¶
Schließlich uiautomator2, ebenfalls mit C/S-Architektur, ist im Vergleich zu Appium präziser und ausreichend schlank, ohne viel Überflüssiges, und die Funktionen sind genau richtig. Aber warum haben wir es aufgegeben? Der Hauptgrund ist, dass es bei mehreren Geräten nicht sehr stabil ist. Zweitens ist die automatische Installationslogik für Anfänger geeignet, aber für eine professionelle Cluster-Steuerung erscheint sie überflüssig und schwer zu kontrollieren, und sie wird nicht gewartet.
Natürlich sind sie alle für den normalen Gebrauch sehr gut geeignet. Aber wir gehen einen weniger konventionellen Weg, denn im Geschäftsleben ist es normalerweise unmöglich, nur Automatisierung durchzuführen. Nehmen wir zum Beispiel an, es gibt eine Aufgabe, eine bestimmte APP zu testen, und die Anfragen, Antworten, Anfragezeiten usw. müssen aufgezeichnet werden. Überlegen Sie, wie Sie das machen würden. Ich denke, Ihr Plan würde entweder viele zusätzliche manuelle Operationen beinhalten oder extrem instabil oder inkompatibel sein. In der Welt von FIRERPA können Sie alle Operationen mit Code durchführen. Alles, womit Sie in Berührung kommen, ist Code; Stabilität und Kompatibilität überlassen Sie FIRERPA. Eigentlich sollten wir uns nicht mit diesen vergleichen, denn funktional ist FIRERPA eine Obermenge aller oben genannten Lösungen; es enthält alle Fallstricke, auf die wir gestoßen sind, und alle Wege, die wir gegangen sind.
Grundlegender Automatisierungs-Workflow¶
Normalerweise müssen Sie Ihren Ansatz vorab prüfen: Führen Sie nur eine reguläre Automatisierung durch oder müssen Sie gleichzeitig mit der Automatisierung auch Anwendungs-Laufzeitdaten erfassen? Im Allgemeinen haben Sie zwei Möglichkeiten zur Datenerfassung: erstens das Abfangen der HTTP/s-Kommunikation durch einen Man-in-the-Middle, und zweitens die Datenerfassung durch Hooking. Die Man-in-the-Middle-Methode ist einfacher und für den regulären Gebrauch geeignet, funktioniert aber möglicherweise bei einigen Anwendungen nicht. Die Hooking-Methode erfordert umfangreiche Reverse-Engineering-Kenntnisse, ist für Anfänger schwer zu erlernen und eignet sich für den Einsatz in Nischenszenarien.
Man-in-the-Middle-Erfassung¶
Die Man-in-the-Middle-Methode ist relativ einfach. Sie müssen nur die relevanten Inhalte zur Installation des Man-in-the-Middle-Zertifikats und zur Einrichtung des Proxys in der Dokumentation finden und dies mit mitmproxy kombinieren, um es zu realisieren. Wenn Sie sich damit überhaupt nicht auskennen, können Sie sich auf unser offizielles Skript startmitm.py beziehen, in dem wir bereits die gesamte Logik für Sie geschrieben haben, die Sie jederzeit kopieren oder wiederverwenden können.
Hook-Erfassung¶
Die Hooking-Methode erfordert, dass Sie über grundlegende oder fortgeschrittene Kenntnisse im Bereich Reverse Engineering verfügen. Wenn Sie davon noch nie gehört haben, müssen Sie diese Methode vorerst nicht in Betracht ziehen. Zusammenfassend lässt sich sagen, dass die Hooking-Methode darin besteht, Frida-Skripte zu schreiben, um relevante Funktionsaufrufe zu hooken, Parameter oder Rückgabewerte zu erhalten und zu übermitteln und sie in die Anwendung zu injizieren. Ein einfaches Demo und eine Anleitung zur Verwendung finden Sie im Kapitel "Daten mit Frida melden".
Automatisierungscode¶
Natürlich ist auch der Automatisierungscode ein unverzichtbarer Bestandteil, da Sie die relevante Logik durch Automatisierung auslösen müssen. Zum Schreiben von Automatisierungscode sollten Sie normalerweise dem folgenden Prozess folgen. Zuerst sollten Sie den Remote-Desktop von FIREPRA öffnen. Sie sollten die folgende Oberfläche sehen.

Öffnen Sie nun die APP, die Sie automatisieren möchten, und klicken Sie dann auf das kleine Augensymbol in der oberen rechten Ecke des Remote-Desktops. Sie sehen dann die folgende Oberfläche. Wählen Sie nun das Element aus, das Sie bedienen möchten, und klicken Sie darauf, um die Elementinformationen anzuzeigen.
Tipp

Sie können die Elementinformationen auf der rechten Seite sehen, wie z. B. text, resourceId usw. Nehmen wir an, wir möchten auf dieses Element klicken. Dann schreiben wir den folgenden Code. Die Bedeutung dieses Codes ist "Klicke auf das Element mit dem Text '同意'".
d(text="同意").click()
Notiz
Okay, Sie haben die einfachste Schreibweise kennengelernt. Schreiben Sie nun if-else und andere Steuerungslogiken, kombiniert mit exists und anderen Schnittstellen, und Sie können einen vollständigen Automatisierungsablauf implementieren. Sehen Sie, es ist nicht so schwer.
Überprüfung des UI-Layouts¶
Normalerweise ist das Schreiben von Automatisierungscode untrennbar mit der Überprüfung des UI-Layouts verbunden. Dies ist auch der einzige Weg, um die Bedingungen für Ihre Selektoren zu erhalten. Zuerst müssen Sie den Remote-Desktop des Geräts in Ihrem Browser öffnen. Klicken Sie dann auf das Augensymbol in der oberen rechten Ecke des Remote-Desktops, um in den Layout-Inspektionsmodus zu gelangen. Sie können nun auf die gestrichelten Rahmen auf dem linken Bildschirm klicken, um die Informationen des entsprechenden Elements anzuzeigen. Sie können die darin enthaltenen Attribute als Parameter für den Selektor verwenden. Ein erneuter Klick auf das Augensymbol schließt die Layout-Inspektion. Die Layout-Inspektion wird nicht aktualisiert, wenn sich die Seite ändert; sie zeigt immer das Bildschirmlayout zum Zeitpunkt des Drückens der Tastenkombination. Wenn Sie das Layout aktualisieren müssen, drücken Sie bitte manuell die Tastenkombination CTRL + R.

Hinweis
UI-Selektor¶
Der UI-Selektor (Selector) wird verwendet, um Android-Elemente zu bedienen. Sie können ihn sich auch als Xpath-Regel vorstellen; obwohl sie unterschiedlich sind, ist ihr Verwendungszweck im Großen und Ganzen derselbe. In FIRERPA ist der Selektor Selector. In den meisten Fällen müssen Sie nicht direkt mit dieser Klasse interagieren. Sie sollten ihn im obigen Text bereits gesehen haben. Vollständig enthält er die folgenden optionalen Parameter.
In den meisten Fällen werden nur resourceId, text, description, textContains usw. als Parameter verwendet. Wenn ein Element eine normale resourceId hat, wird diese vorzugsweise als Selektor verwendet, z. B. d(resourceId="com.xxx:id/mobile_signal"). Andernfalls wird text verwendet, z. B. d(text="Klicken zum Eintreten"), oder etwas unschärfer d(textContains="Klicken"). description ist analog zu text, wird aber seltener verwendet.
Hinweis
Definition der Bildschirmkoordinaten¶
Bei Automatisierungsoperationen ist es unvermeidlich, dass man auf Situationen stößt, in denen Operationen anhand detaillierter Koordinaten oder regionaler Koordinaten durchgeführt werden müssen. Da jedoch viele Leute möglicherweise nicht sehr vertraut mit Koordinatenproblemen sind, stellen wir hier das Wissen über Bildschirmkoordinaten von Android vor.
Wie allgemein bekannt ist, haben Bilder eine Auflösung, und Bildschirme auch. Für den Android-Bildschirm, egal ob im Hoch- oder Querformat oder bei automatischer Drehung, wird einheitlich die obere linke Ecke als Ursprung (0,0) eines Koordinatensystems verwendet, das sich nach rechts und nach unten erstreckt. X ist die horizontale Achse und Y die vertikale Achse, wie in der Abbildung gezeigt.
Aus der obigen Abbildung ist ersichtlich, dass die Koordinate der oberen linken Ecke des Bildschirms 0,0 ist, die der oberen rechten Ecke 1080,0, die der unteren linken Ecke 0,1920 und die der unteren rechten Ecke 1080,1920. Mit diesen Informationen können Sie die Koordinaten jedes beliebigen Punktes auf dem Bildschirm berechnen.
Notiz
Ein Punkt auf dem Bildschirm¶
In FIRERPA gibt es zwei Definitionen für den Bildschirm. Einige Operationen wie Klicken oder Screenshots erfordern, dass Sie Bereichs- oder Koordinateninformationen angeben. Für gängige Koordinatenpunkte verwenden wir die folgende Definition, die den Punkt mit den Bildschirmkoordinaten 100,100 darstellt.
Point(x=100, y=100)
Definition eines Bereichs¶
Die Definition eines Bereichs ist ein rechteckiger Bereich auf dem Bildschirm. Seine Definition ist etwas komplizierter, bitte lesen Sie sie sorgfältig durch. Wir verwenden Bound, um einen Bereich auf dem Bildschirm darzustellen. Es erfordert vier Parameter: top, left, bottom und right. Sie könnten etwas verwirrt sein, bitte verstehen Sie das Folgende sorgfältig: top repräsentiert den Abstand in Pixeln vom oberen Rand des Rechtecks zum oberen Rand des Bildschirms, left repräsentiert den Abstand in Pixeln vom linken Rand des Rechtecks zum linken Rand des Bildschirms, right repräsentiert den Abstand vom rechten Rand des Rechtecks zum linken Rand des Bildschirms und bottom repräsentiert den Abstand vom unteren Rand des Rechtecks zum oberen Rand des Bildschirms. Kurz gesagt, Sie können verstehen, dass alle Abstände die Abstände auf den vom Ursprung ausgehenden X- und Y-Achsen sind. Im Folgenden verwenden wir eine Abbildung, um Ihr Verständnis zu unterstützen. Der Bildschirm des Telefons hat immer noch eine Auflösung von 1080x1920, und das Gerät befindet sich derzeit im Hochformat.
Nehmen wir nun an, der Bildschirm ist in vier gleiche Teile geteilt, und wir müssen die Definitionen für die beiden in der Abbildung gezeigten Bereiche oben links und unten rechts erhalten. Gemäß den Regeln beträgt der Abstand vom oberen Rand des Rechtecks von Bereich 1 zum oberen Rand des Bildschirms 0 Pixel, der Abstand vom linken Rand des Rechtecks zum linken Rand des Bildschirms 0 Pixel, der Abstand vom unteren Rand des Rechtecks zum oberen Rand des Bildschirms 960 Pixel (1920÷2) und der Abstand vom rechten Rand des Rechtecks zum linken Rand des Bildschirms 540 Pixel (1080÷2). Seine Definition sollte also lauten:
Bound(top=0, left=0, right=540, bottom=960)
Analog dazu beträgt der Abstand vom oberen Rand des Rechtecks von Bereich 2 zum oberen Rand des Bildschirms 960 Pixel, der Abstand vom linken Rand des Rechtecks zum linken Rand des Bildschirms 540 Pixel, der Abstand vom rechten Rand des Rechtecks zum linken Rand des Bildschirms 1080 Pixel und der Abstand vom oberen Rand des Rechtecks zum oberen Rand des Bildschirms 1920 Pixel. Daraus ergibt sich, dass die Definition des zweiten Rechtecks lautet:
Bound(top=960, left=540, right=1080, bottom=1920)
Daten von Android-Anwendungen¶
Jede Android-Anwendung hat auf dem Gerät ein spezielles Verzeichnis zur Speicherung ihrer Daten. Normalerweise werden die relevanten Daten der Anwendung im Verzeichnis /data gespeichert. Sie können die Schnittstelle d.application("com.example").info() aufrufen, um das Datenverzeichnis der Anwendung zu erhalten. In den meisten Fällen können Sie auch direkt mit cd in das Verzeichnis /data/user/0/com.example.test wechseln, um direkt in das Benutzerverzeichnis zu gelangen. Neben dem regulären /data-Verzeichnis speichern einige Anwendungen auch Multimedia- und andere Dateien im Verzeichnis /sdcard/Android.
Anzeigen der SMS-Datenbank¶
Manchmal möchten Sie vielleicht sehen, wo die auf diesem Gerät empfangenen SMS gespeichert sind. Das ist eine sehr gute Idee und sehr einfach. Sie können sogar durch das Schreiben einer Extension den Inhalt direkt lesen und über eine HTTP-Schnittstelle in Echtzeit abrufen! Wir folgen dem regulären Android-Ansatz. Wenn Ihrer anders ist, denken Sie bitte selbst weiter. Auf Android sollte der Name der SMS-Anwendung com.android.mms sein, also können wir direkt in das Verzeichnis /data/user/0/com.android.mms wechseln. Durch unsere folgenden Operationen können Sie sehen, dass es im Verzeichnis databases mehrere Datenbanken gibt. Hier ist mmssms.db unser Ziel.
λ 10:12 /data/user/0/com.android.mms ➥ ls -la
total 82
drwx------ 7 u0_a78 u0_a78 3452 Jan 2 2021 .
drwxrwx--x 381 system system 53248 May 2 16:46 ..
drwxrws--x 3 u0_a78 u0_a78_c 3452 Jan 2 2021 cache
drwxrws--x 2 u0_a78 u0_a78_c 3452 Jan 2 2021 code_cache
drwxrwx--x 2 u0_a78 u0_a78 3452 Jan 2 2021 databases
drwxrwx--x 7 u0_a78 u0_a78 24576 Feb 26 13:43 files
drwxrwx--x 2 u0_a78 u0_a78 3452 May 4 10:12 shared_prefs
λ 10:12 /data/user/0/com.android.mms ➥ ls -l databases/
total 504
-rw-rw---- 1 u0_a78 u0_a78 24576 Jan 2 2021 dynamic_bubble
-rw------- 1 u0_a78 u0_a78 0 Jan 2 2021 dynamic_bubble-journal
-rw-rw---- 1 u0_a78 u0_a78 491520 Feb 27 04:18 mmssms.db
-rw------- 1 u0_a78 u0_a78 0 Jan 2 2021 mmssms.db-journal
λ 10:12 /data/user/0/com.android.mms ➥
Das Lesen ist natürlich sehr einfach, da die Datenbanken regulärer Anwendungen unter Android SQLite sind. Einige Anwendungen mit höherer Sicherheit verschlüsseln jedoch normalerweise ihre eigenen Datenbanken. Aber natürlich, wie könnte FireRPA so leistungsstark sein und das nicht können? FireRPA kann nicht nur reguläres SQLite lesen, sondern unterstützt auch das Echtzeit-Lesen verschiedener Arten von Datenbanken wie WeChat (sqlcipher) aes-256, Enterprise WeChat aes-128, Alibaba-Serien sqlcrypto (aes-128) (natürlich unter der Voraussetzung, dass Sie den Schlüssel selbst finden müssen). Im Folgenden zeigen wir Ihnen einfach, wie Sie den SMS-Inhalt des Systems lesen. Es ist sehr einfach, ein Befehl genügt. Natürlich können Sie auch eine Extension schreiben, um ihn zu lesen.
sqlite3 databases/mmssms.db .dump
Natürlich ist die Ausgabe eine riesige Menge, aber Sie können darin schnell die Tabelle finden, in der sich die benötigten Daten befinden, und dann selbst SQL verwenden. Diese Methode ist auf 98% der Android-Anwendungen anwendbar, die restlichen 2% sind verschlüsselte Datenbanken.
Anzeigen verschlüsselter Datenbanken¶
Für diese verschlüsselten Datenbanken müssen Sie den Datenbankschlüssel oder seine Berechnungsmethode selbst finden. Im Folgenden wird kurz beschrieben, wie die Datenbanken der entsprechenden Software gelesen werden. Wir beschreiben nur, wie man PRAGMA verwendet, um den Schlüssel voreinzustellen. Wenn Sie nicht verstehen, was das ist, informieren Sie sich bitte zuerst über SQLite.
WeChat-Serie (sqlcipher)
PRAGMA cipher = "sqlcipher";
PRAGMA legacy = 1;
PRAGMA key = "database-key";
Enterprise WeChat (wxsqlite)
PRAGMA cipher = "aes128cbc";
PRAGMA hexkey = "database-key"
Alibaba-Serie (sqlcrypto)
PRAGMA cipher = "sqlcrypto";
PRAGMA key = "database-key"
Hinweis
Anzeigen anderer Daten¶
Natürlich gibt es im Anwendungsdatenverzeichnis nicht nur Datenbanken, sondern auch einige anwendungsbezogene Parameter, Konfigurationen, Caches, Dateien wie shared_prefs (xml) usw. Wir werden jedoch nicht weiter darauf eingehen, Sie können es selbst erkunden.
Unterstützende Maßnahmen für die Automatisierung¶
Im Automatisierungsgeschäft sind nicht alle Anwendungen für die Lokalisierung mit Selektoren geeignet. Einige Oberflächen, wie z. B. Spiele, werden in Echtzeit gerendert und haben kein Seitenlayout auf Android-Ebene. Für solche Anwendungen können Sie daher nur OCR oder Bildabgleich zur Operationserkennung verwenden. Wir bieten eine vollständige OCR-Hilfslösung sowie integrierte Bild-SIFT- und Vorlagenabgleichslösungen, um die Erreichung dieser Geschäftsziele zu unterstützen. Sie finden die entsprechenden Schnittstellen und deren Verwendungsmethoden in der Dokumentation.
Wird aktualisiert...