usar - tag android studio



Ejecute una prueba de instrumentos desde la aplicación y espere el resultado (1)

Estoy desarrollando una solución de automatización de control de calidad que puede grabar / reproducir pruebas de control de calidad en Android. Un requisito comercial clave es no tener que depender de una PC conectada mientras se reproduce la prueba grabada. Para ello, estoy tratando de ejecutar una prueba de Instrumentación sin una PC conectada. (Específicamente, una prueba Appium UiAutomator2).

Mi enfoque actual es intentar ejecutar la prueba programáticamente desde mi aplicación. Si estuviera ejecutando la prueba normalmente desde una PC conectada, usaría el comando adb shell am instrument -w . Intenté acceder a ADB Shell desde mi aplicación y ejecuté am instrument -w , pero esto produce un error que me falta el permiso INTERACT_ACROSS_USERS_FULL.

Para startInstrumentation este problema, estoy intentando ejecutar la prueba utilizando startInstrumentation . Esto comienza con éxito la prueba. Sin embargo, la prueba se bloquea de inmediato. Tras una investigación adicional, rastreé la falla hasta una NPE: la prueba está intentando recuperar InstrumentationRegistry.getInstrumentation.getUiAutomation(0) , pero esto devuelve un valor nulo.

¿Cómo ejecuto la prueba programáticamente y le doy acceso a la instancia UiAutomation requerida?

Así es como empiezo la prueba:

public void runTest() {
    final String pm = getPackageName().replaceFirst(".test$", "");
    final InstrumentationInfo info = getInstrumentationInfo(pm);
    if (info != null) {

        final ComponentName cn = new ComponentName(info.packageName,
                info.name);

        Bundle arguments = new Bundle();
        arguments.putString("class", "io.testim.appiumwrapper.test.AppiumUiAutomator2Server");
        //cn = {io.extension.test/android.support.test.runner.AndroidJUnitRunner}
        startInstrumentation(cn, null, arguments);

    } 
}

consulte el nivel de protección de la firma, aclarando ... a menos que el paquete esté en la lista blanca con la clave de lanzamiento de Google, no podrá obtener el permiso necesario. esta es una característica de seguridad / integridad, con el propósito de limitar lo que el malware puede hacer, y lo que usted pretende hacer allí, es el comportamiento típico del malware, sin importar la intención real del mismo; Trabajar contra el sistema no lleva a ninguna parte.

la única forma de obtener imágenes sería ejecutar comandos directamente desde un emulador de terminal o desde la aplicación de prueba, contra una compilación personalizada de AOSP , para que pueda agregar android:protectionLevel="signature" al Manifest.xml y luego requerir android.permission.INTERACT_ACROSS_USERS_FULL . pero con un stock ROM, definitivamente no hay posibilidad de hacerlo. no lo es, que sería "imposible", pero construir una ROM personalizada significa bastante esfuerzo para llegar allí. al menos para los dispositivos Nexus y Pixel , los controladores necesarios están disponibles here ; para otros dispositivos, tendría que encontrarlos en el proveedor del dispositivo, si es que están disponibles.

El truco consiste en cerrar la ROM con la misma clave que la aplicación (solo así se pueden obtener los permisos de nivel de signature , mientras que para una ROM de inventario, (teóricamente) necesitaría la clave de lanzamiento de Google para cerrar la sesión. Uno puede imponer un solo usuario, como se explica here , aunque esto también está disponible solo para las aplicaciones del sistema.