Cómo compilar microcomparativas sin Gradle

En esta página, se describe la configuración de un sistema de compilación que no es de Gradle cuando se usa la biblioteca de Microbenchmark.

Si bien la biblioteca de Microbenchmark envía un complemento de Gradle para integrarse directamente con el complemento de Android para Gradle, también puedes usar microcomparativas en otros sistemas de compilación, como Bazel o Buck.

Instrumentación

Usa la clase AndroidBenchmarkRunner o una subclase como panel de instrumentación especificándola en el bloque de instrumentación del manifiesto de prueba, como se muestra a continuación:

<manifest
    package="com.example.library.test" ...>

    <instrumentation android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner" />
    ...
</manifest>

Para obtener mediciones precisas, las comparativas no deben ser depurables. Si no configuras la marca de depuración correctamente, la biblioteca muestra un error, en lugar de informar resultados no válidos. Es posible que necesites activar esta configuración durante las ejecuciones locales para su uso con generadores de perfiles de Android Studio, que requieren debuggable=true.

Puedes compilar microcomparativas para que se ejecuten de dos maneras: dentro de un APK de instrumentación autónoma o con un APK de prueba que instrumente otro APK.

APKs de instrumentación autónoma

Con un simple APK de instrumentación autónoma (como salida de Gradle para un directorio androidTest de com.android.library), debes inhabilitar la depuración en el manifiesto de Android del APK único de la siguiente manera:

<manifest
    package="com.example.library.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.library.test"/>

    <application android:debuggable="false"/>
</manifest>

El APK de la app instrumentado por un APK de prueba

Si tu compilación genera dos APKs, un APK de app y un APK de prueba, como salida de Gradle para un directorio com.android.app del paquete androidTest, debes configurar el APK de la app como debuggable=false. El SO Android ignora la marca de depuración del APK de prueba.

<!-- Test manifest. -->
<manifest
    package="com.example.android.app.test" ...>

    <instrumentation
        android:name="androidx.benchmark.junit4.AndroidBenchmarkRunner"
        android:targetPackage="com.example.android.app"/>
    <!-- This debuggable is ignored by the OS. -->
</manifest>

<!-- App being tested. -->
<manifest
    package="com.example.android.app" ...>

    <application android:debuggable="false"/>
</manifest>

Android Studio y Gradle no admiten las microcomparativas de un APK de un módulo de app. Esto se debe a la complejidad de brindar compatibilidad con un directorio de prueba adicional que depende de una variante no depurable, optimizada o reducida del APK, pero sin la reducción que rompe las llamadas de las comparativas en código de apps.

Compilación

Te recomendamos compilar el APK de microcomparativas antes de ejecutar las pruebas con el siguiente comando:

adb shell cmd package compile -f -m speed com.example.benchmark

Reducción y optimización

Te recomendamos que reduzcas y optimices las comparativas para obtener un rendimiento más cercano al de la versión original. Para obtener ejemplos de código, consulta el Proyecto de muestra de comparativas.

Cobertura de código

Te recomendamos que ejecutes las comparativas con la cobertura inhabilitada y sin modificaciones en ninguna biblioteca o DEX con herramientas, como JaCoCo.

Por esta razón, te recomendamos que aísles las comparativas como un conjunto de orígenes de otras pruebas de instrumentación, y que las compiles por separado con dependencias de lanzamientos. De esta manera, evita tener que realizar pruebas más de una vez, con cobertura y sin esta.

Las variantes de depuración de las bibliotecas de las que depende tu comparativa, especialmente las compiladas de forma local, se pueden compilar con la cobertura habilitada.

Ejecuta las pruebas

Puedes ejecutar las pruebas desde la línea de comandos y especificar las clases con las que se ejecutarán, como se muestra en los siguientes ejemplos:

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

Para configurar la biblioteca de Microbenchmark en tiempo de ejecución sin Gradle, consulta Argumentos de instrumentación de microcomparativas.