Conocimientos Básicos

Este capítulo le presenta los conocimientos básicos relacionados con la automatización de Android. Asegúrese de leer la descripción de este capítulo, ya que no se repetirá más adelante. La automatización de Android es muy diferente de la automatización web convencional, pero también comparten muchas similitudes. En la automatización web convencional, es muy sencillo ver el diseño de la página y la información como los ID de los elementos a través de las herramientas de desarrollador F12, y luego usar XPATH para obtener elementos y realizar operaciones como clics y esperas. Por supuesto, la lógica es similar en Android, donde también puede usar algo llamado selector para seleccionar elementos y realizar operaciones como clics y juicios, por lo que no debe preocuparse de que sea difícil comenzar.

Similitudes y Diferencias entre la Automatización Móvil y Web

La automatización en dispositivos móviles y en la web tiene muchas similitudes, pero también muchas diferencias. Tomemos Selenium como ejemplo. Generalmente, para controlar una página web con Selenium, necesita tres cosas: un navegador, un webdriver y Selenium. Por supuesto, en el lado móvil es lo mismo: el teléfono móvil equivale al navegador, FIRERPA equivale al webdriver, y la biblioteca de Python de FIRERPA, es decir, lamda, equivale a Selenium. Además, sus objetivos son los mismos: ejecutar operaciones de usuario simuladas para realizar pruebas, recopilación de datos o ejecución automática de tareas. Ambas son impulsadas por scripts y realizan operaciones como localizar elementos, hacer clic, tomar capturas de pantalla y realizar juicios. Visto así, en realidad son bastante similares.

Pero también son diferentes. En primer lugar, la automatización móvil requiere que tenga un teléfono y una computadora, mientras que la automatización web se puede realizar en su propia computadora. Además, no utilizan el mismo conjunto de soluciones. Para la web, las herramientas comunes son Selenium, Puppeteer, Playwright. Para dispositivos móviles, suelen ser FIRERPA, AutoJS, Appium, uiautomator, etc.

Para la web, los métodos de localización comunes se basan principalmente en la estructura del DOM HTML, como xpath o csspath, y la jerarquía de elementos es relativamente intuitiva. Para dispositivos móviles, el método de localización común es el selector, aunque las interfaces de las aplicaciones de Android también usan diseños XML, por lo que también puede usar xpath con XML. Por lo general, la automatización web no necesita considerar demasiados problemas de compatibilidad; en la mayoría de los casos, se pueden evitar los problemas de compatibilidad causados por el dispositivo fijando el navegador y la resolución de inicio. Sin embargo, para Android, debido a las diferencias entre varias marcas y modelos de dispositivos, el tamaño de la pantalla, la versión del sistema, etc., pueden afectar la compatibilidad del código de automatización. Pero no se asuste, aunque hay un impacto, no es grande.

Diferencias entre Varias Herramientas de Automatización

Como se mencionó anteriormente, también existen muchas diferencias entre las diversas herramientas de automatización de Android que hemos mencionado. Primero, dejemos clara nuestra postura: FIRERPA es la herramienta de automatización más estable, con más funciones, más potente y más adecuada para la gestión y aplicación de proyectos.

Nota

Nuestra postura no es un prejuicio, sino que se ha formado a lo largo de 6 años de exploración y optimización continuas. Básicamente, hemos recorrido los mismos caminos y tropezado con los mismos obstáculos que usted.

AutoJS

Los productos derivados comunes como AutoJS pertenecen a la categoría de autocontrol. Requieren la instalación de un APK en el dispositivo y la escritura de scripts en JS para operar. Por lo general, AutoJS solo puede realizar operaciones a nivel de automatización. Su ventaja es que es adecuado para principiantes o uso aficionado, con una barrera de entrada baja. Sin embargo, su diseño no es adecuado para el control, la gestión y la actualización de scripts a gran escala. Se encuentra en un estado descentralizado y sin gestión, lo que impide un control preciso a gran escala.

Appium

Appium, comúnmente utilizado por los testers, tiene una arquitectura C/S y es relativamente más adecuado para el control de clústeres que AutoJS. Sin embargo, tiene desventajas evidentes. Debido a que es aplicable a la automatización de la mayoría de los sistemas, además de ser compatible con Android, también es compatible con iOS, lo que lo hace voluminoso y pesado, y muy inadecuado para implementaciones a gran escala.

u2

Finalmente, uiautomator2, también con arquitectura C/S, es más preciso que Appium y ha alcanzado un nivel de simplicidad suficiente, sin demasiadas cosas superfluas y con funciones justas. Pero, ¿por qué lo abandonamos? La razón principal es que no es muy estable en situaciones con múltiples dispositivos. En segundo lugar, la lógica de instalación automática es adecuada para principiantes, pero para el control profesional de clústeres, parece superflua y difícil de manejar, y además no tiene mantenimiento.

Por supuesto, todas son muy adecuadas para el uso convencional. Pero resulta que nuestro camino no es muy convencional, porque en los negocios, generalmente no es posible realizar solo automatización. Por ejemplo, si hay una tarea para probar una determinada APP, que requiere registrar las solicitudes, respuestas, tiempos de solicitud, etc. Piense en cómo lo haría. Creo que su solución incluiría muchas operaciones manuales adicionales o sería extremadamente inestable o incompatible. En el mundo de FIRERPA, puede realizar todas las operaciones con código. Lo único con lo que interactúa es el código; la estabilidad y la compatibilidad se las deja a FIRERPA. En realidad, no deberíamos compararnos con estos, porque en términos de funcionalidad, FIRERPA es un superconjunto de todas las soluciones anteriores; incluye todos los obstáculos con los que nos hemos topado y los caminos que hemos recorrido.

Flujo Básico de Automatización

Normalmente, necesita investigar y planificar su solución, ya sea que solo vaya a realizar una automatización convencional o si necesita realizar una extracción de datos de la aplicación en ejecución al mismo tiempo. Por lo general, tiene dos opciones para la extracción de datos: la primera es interceptar la comunicación HTTP/s a través de un intermediario (Man-in-the-Middle), y la segunda es interceptar datos mediante Hooking. El método del intermediario es más simple y adecuado para el uso convencional, pero puede no funcionar con algunas aplicaciones. La solución de Hooking requiere un conocimiento considerable de ingeniería inversa, es difícil para principiantes y es adecuada para casos de uso marginales.

Captura Man-in-the-Middle

La solución de intermediario es relativamente simple. Solo necesita encontrar el contenido relevante en la documentación sobre la instalación de certificados de intermediario y la configuración de proxies, y usarlo junto con mitmproxy. Si no está familiarizado con esto, puede consultar nuestro script oficial startmitm.py, que ya tiene toda la lógica escrita para que pueda copiarla o reutilizarla en cualquier momento.

Captura con Hook

La solución de Hooking requiere que tenga habilidades de ingeniería inversa de nivel principiante o superior. Si nunca ha oído hablar de esto antes, no necesita considerar esta solución por ahora. En resumen, la solución de Hooking implica escribir scripts de Frida para enganchar las llamadas a funciones relevantes, obtener parámetros o valores de retorno y enviarlos, inyectándolos en la aplicación. Puede encontrar un Demo simple y métodos de uso en el capítulo "Usar Frida para Reportar Datos".

Código de Automatización

Por supuesto, el código de automatización también es una parte indispensable, ya que necesita desencadenar la lógica relevante a través de la automatización. Para escribir código de automatización, su flujo de trabajo generalmente debería ser el siguiente. Primero, debe abrir el escritorio remoto de FIREPRA. Debería ver una interfaz como la siguiente.

Escritorio Remoto

Ahora, abra la APP que desea automatizar y luego haga clic en el icono del "ojo pequeño" en la esquina superior derecha del escritorio remoto. Verá la siguiente interfaz. En este punto, seleccione el elemento que desea operar y haga clic para ver la información del elemento.

Consejo

Por supuesto, también se puede abrir con código; todo esto se explicará más adelante.

Seleccionar Elemento

Puede ver la información del elemento a la derecha, como text, resourceId, etc. Ahora, si queremos hacer clic en este elemento, escribimos el siguiente código. El significado de este código es "hacer clic en el elemento cuyo texto es '同意'".

d(text="同意").click()

Nota

Esto es solo un ejemplo. Hay muchas formas de escribir selectores; el ejemplo solo muestra la más simple.

Bien, ya ha aprendido la forma más simple. Ahora, escriba la lógica de control como if else, junto con otras interfaces como exists, y podrá implementar un flujo completo de operaciones de automatización. ¿Ve? No es tan difícil.

Inspección del Diseño de la Interfaz

Normalmente, escribir código de automatización es inseparable de la inspección del diseño de la interfaz, que es la única forma de obtener las condiciones para los selectores. Primero, necesita abrir el escritorio remoto del dispositivo en su navegador. Luego, haga clic en el icono del ojo en la esquina superior derecha del escritorio remoto para entrar en el modo de inspección de diseño. En este punto, puede hacer clic en los cuadros de puntos en la pantalla de la izquierda para ver la información del elemento correspondiente. Puede usar sus atributos como parámetros para el selector. Al hacer clic nuevamente en el icono del ojo se cerrará la inspección de diseño. La inspección de diseño no se actualiza a medida que cambia la página; siempre muestra el diseño de la pantalla en el momento en que presionó la tecla de acceso rápido. Si necesita actualizar el diseño, presione manualmente la tecla de acceso rápido CTRL + R.

Inspeccionar Elemento

Sugerencia

También puede presionar la tecla TAB en la interfaz de inspección de diseño para recorrer y ver todos los elementos.

Selectores de Interfaz

El Selector de interfaz se utiliza para operar elementos de Android. También puede entenderlo como una regla Xpath; aunque son diferentes, su propósito general es el mismo. En FIRERPA, el selector es Selector, y en la mayoría de los casos, no necesitará interactuar directamente con esta clase. En el texto anterior, debería haber visto esto. En su forma completa, incluye los siguientes parámetros opcionales.

Tipo de CoincidenciaDescripción
textCoincidencia exacta de texto
textContainsEl texto contiene la coincidencia
textStartsWithEl texto comienza con la coincidencia
classNameCoincidencia de nombre de clase
descriptionCoincidencia exacta de descripción
descriptionContainsLa descripción contiene la coincidencia
descriptionStartsWithLa descripción comienza con la coincidencia
clickableSe puede hacer clic
longClickableSe puede mantener presionado
scrollableSe puede desplazar
resourceIdCoincidencia de ID de recurso

En la mayoría de los casos, solo se utilizan resourceId, text, description, textContains, etc., como parámetros. Si un elemento tiene un resourceId normal, se le da prioridad como Selector, como en d(resourceId="com.xxx:id/mobile_signal"). De lo contrario, se usará text, como en d(text="点击进入"), o de forma más vaga d(textContains="点击"). description es similar a text, pero se usa con menos frecuencia.

Sugerencia

El Selector se construye a partir de los parámetros principales relevantes que obtiene a través de la función de inspección de diseño de la interfaz mencionada anteriormente.

Definición de Coordenadas de Pantalla

En el proceso de operaciones de automatización, es inevitable encontrar situaciones que requieren operar con coordenadas detalladas o coordenadas de área. Sin embargo, como muchas personas pueden no estar muy familiarizadas con el tema de las coordenadas, aquí presentamos el conocimiento sobre las coordenadas de la pantalla de Android.

Como todos sabemos, las imágenes tienen una resolución, y las pantallas también. Para la pantalla de Android, ya sea en modo vertical, horizontal o con rotación automática, la esquina superior izquierda se utiliza uniformemente como el origen (0,0) en un sistema de coordenadas que se extiende hacia la derecha y hacia abajo. X es el eje horizontal e Y es el eje vertical, como se muestra en la figura.

Coordenadas de Pantalla

Como se puede ver en la figura anterior, las coordenadas de la esquina superior izquierda de la pantalla son (0,0), las de la esquina superior derecha son (1080,0), las de la esquina inferior izquierda son (0,1920) y las de la esquina inferior derecha son (1080,1920). Puede usar esta información para calcular las coordenadas de cualquier punto en la pantalla.

Nota

Independientemente de si la pantalla es nativamente vertical u horizontal, o si rota automáticamente, la esquina superior izquierda de la orientación actual de la pantalla se utiliza siempre como el origen.

Puntos en la Pantalla

En FIRERPA, hay dos definiciones relacionadas con la pantalla. Algunas operaciones, como hacer clic o tomar capturas de pantalla, requieren que proporcione información de área o coordenadas. Para un punto de coordenadas común, usamos la siguiente definición, que representa el punto en las coordenadas de pantalla (100,100).

Point(x=100, y=100)

Definición de Regiones

La definición de una región es un área rectangular en la pantalla. Su definición es un poco más compleja, así que por favor léala con atención. Usamos Bound para representar un área en la pantalla, que requiere que proporcione cuatro parámetros: top, left, bottom y right. Puede que esté un poco confundido, así que por favor entienda lo siguiente cuidadosamente: top representa la distancia en píxeles desde el borde superior del rectángulo hasta el borde superior de la pantalla, left representa la distancia en píxeles desde el borde izquierdo del rectángulo hasta el borde izquierdo de la pantalla, right representa la distancia desde el borde derecho del rectángulo hasta el borde izquierdo de la pantalla, y bottom representa la distancia desde el borde inferior del rectángulo hasta el borde superior de la pantalla. En resumen, puede entender que todas las distancias se basan en la distancia desde los ejes X e Y que irradian desde el origen. A continuación, usamos una imagen para ayudarle a comprender. La pantalla del teléfono sigue siendo de 1080x1920, y el dispositivo está actualmente en modo vertical.

Región de la Pantalla

Ahora supongamos que la pantalla está dividida en cuatro partes iguales y necesitamos obtener la definición de las dos regiones que se muestran en la figura: la superior izquierda y la inferior derecha. Según las reglas, para la región 1, la distancia desde el borde superior del rectángulo hasta el borde superior de la pantalla es de 0 píxeles, la distancia desde el borde izquierdo del rectángulo hasta el borde izquierdo de la pantalla es de 0 píxeles, la distancia desde el borde inferior del rectángulo hasta el borde superior de la pantalla es de 960 píxeles (1920÷2), y la distancia desde el borde derecho del rectángulo hasta el borde izquierdo de la pantalla es de 540 píxeles (1080÷2). Por lo tanto, su definición debería ser:

Bound(top=0, left=0, right=540, bottom=960)

De manera similar, para la región 2, la distancia desde el borde superior del rectángulo hasta el borde superior de la pantalla es de 960 píxeles, la distancia desde el borde izquierdo del rectángulo hasta el borde izquierdo de la pantalla es de 540 píxeles, la distancia desde el borde derecho del rectángulo hasta el borde izquierdo de la pantalla es de 1080 píxeles, y la distancia desde el borde inferior del rectángulo hasta el borde superior de la pantalla es de 1920 píxeles. Por lo tanto, la definición del segundo rectángulo es:

Bound(top=960, left=540, right=1080, bottom=1920)

Datos de Aplicaciones de Android

Cada aplicación de Android tiene un directorio dedicado en el dispositivo para almacenar sus datos. Por lo general, los datos de la aplicación se almacenan en el directorio /data. Puede obtener el directorio de datos de una aplicación llamando a la interfaz d.application("com.example").info(). En la mayoría de los casos, también puede cambiar directamente al directorio del usuario con cd /data/user/0/com.example.test. Además del directorio /data convencional, algunas aplicaciones también almacenan archivos multimedia y otros en el directorio /sdcard/Android.

Ver la Base de Datos de SMS

A veces, es posible que desee ver dónde se almacenan los mensajes SMS recibidos en el dispositivo. Es una muy buena idea y muy simple. ¡Incluso puede leer el contenido directamente y obtenerlo en tiempo real a través de una interfaz HTTP escribiendo una extensión! Seguiremos el enfoque estándar de Android. Si el suyo es diferente, siéntase libre de pensar de forma divergente. En Android, el nombre de la aplicación de SMS debería ser com.android.mms, por lo que podemos cambiar directamente al directorio /data/user/0/com.android.mms. Con la siguiente operación, puede ver que hay varias bases de datos en el directorio databases, y mmssms.db es nuestro objetivo.

 λ 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 ➥

Por supuesto, leerlo es muy simple, porque en Android, las bases de datos de aplicaciones convencionales son SQLite. Sin embargo, algunas aplicaciones con mayor seguridad suelen cifrar sus propias bases de datos. Por supuesto, ¿cómo podría FireRPA no tener esto? FireRPA no solo puede leer SQLite convencional, sino que también admite la lectura en tiempo real de varios tipos de bases de datos como WeChat (sqlcipher) aes-256, WeChat Work aes-128, y las del sistema Ali (sqlcrypto) (aes-128) (por supuesto, con la condición de que necesite encontrar la clave usted mismo). A continuación, le mostraremos cómo leer el contenido de los SMS del sistema. Es muy simple, se puede hacer con un solo comando, y también puede escribir una extensión para leerlo.

sqlite3 databases/mmssms.db .dump

Por supuesto, la salida será enorme, pero puede encontrar rápidamente la tabla donde se encuentran los datos que necesita y luego usar SQL por su cuenta. Este método es aplicable al 98% de las aplicaciones de Android; el 2% restante son bases de datos cifradas.

Ver Bases de Datos Cifradas

Para estas bases de datos cifradas, necesita encontrar la clave de la base de datos o su método de generación. A continuación, le presentamos brevemente cómo leer las bases de datos de software relevante. Solo presentaremos cómo preestablecer la clave usando PRAGMA. Si no entiende qué es esto, por favor, primero aprenda sobre SQLite.

Serie WeChat (sqlcipher)

PRAGMA cipher = "sqlcipher";
PRAGMA legacy = 1;
PRAGMA key = "database-key";

WeChat Work (wxsqlite)

PRAGMA cipher = "aes128cbc";
PRAGMA hexkey = "database-key"

Serie Ali (sqlcrypto)

PRAGMA cipher = "sqlcrypto";
PRAGMA key = "database-key"

Sugerencia

Las bases de datos de las aplicaciones de Android no siempre se encuentran en el directorio `databases`.

Ver Otros Datos

Por supuesto, el directorio de datos de la aplicación contiene más que solo bases de datos. También incluye algunos parámetros, configuraciones, cachés y archivos relacionados con la aplicación, como shared_prefs (xml), etc. Sin embargo, no entraremos en demasiados detalles aquí; puede explorarlo por su cuenta.

Medidas Auxiliares de Automatización

En el negocio de la automatización, no todas las aplicaciones son adecuadas para la localización mediante selectores. Algunas interfaces, como las de los juegos, se renderizan en tiempo real y no tienen un diseño de página a nivel de Android. Por lo tanto, para este tipo de aplicaciones, solo puede usar OCR o coincidencia de imágenes para la discriminación de operaciones. Ofrecemos una solución completa de asistencia de OCR y soluciones integradas de SIFT de imágenes y coincidencia de plantillas para ayudar a lograr estos objetivos comerciales. Puede encontrar las interfaces relevantes y sus métodos de uso en la documentación.

Actualizando...