Criar microcomparações sem o Gradle

Esta página descreve como configurar um sistema de build que não seja do Gradle usando a biblioteca Microbenchmark.

Embora a biblioteca Microbenchmark envie um plug-in do Gradle para ser integrado diretamente ao Plug-in do Android para Gradle, também é possível usá-la em outros sistemas de build, como o Bazel ou o Buck.

Instrumentação

Use AndroidBenchmarkRunner ou uma subclasse como executor de instrumentação especificando-o no bloco de instrumentação do manifesto de teste:

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

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

Para ter medições precisas, as comparações não podem ser depuráveis. Se você não definir a flag depurável corretamente, a biblioteca vai gerar um erro em vez de informar resultados inválidos. Talvez seja necessário ativar essa configuração durante execuções locais para uso com os criadores de perfil do Android Studio, que exigem debuggable=true.

As microcomparações podem ser criadas para execução de duas maneiras: em um APK com autoinstrumentação ou com um APK de teste para instrumentar outro APK.

APKs com autoinstrumentação

Em um APK com autoinstrumentação, como saída do Gradle para um diretório androidTest de com.android.library, é necessário desativar a flag depurável no manifesto Android único do arquivo:

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

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

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

APK de app instrumentado por APK de teste

Se o build gerar dois APKs, ou seja, um APK do app e outro de teste, como saída do Gradle para o diretório androidTest do pacote com.android.app, defina o APK do app como debuggable=false. A sinalização depurável do APK de teste é ignorada pelo SO Android.

<!-- 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>

O Android Studio e o Gradle não oferecem suporte à microcomparação de APKs de módulo de app. Isso se deve à complexidade de oferecer suporte a outro diretório de teste que dependa de uma variante não depurável, otimizada ou minificada do APK, mas sem a minificação das chamadas dos comparativos para o código do app.

Compilação

Recomendamos compilar seu APK de microcomparação antes de executar testes usando a seguinte comando:

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

Minificação e otimização

Recomendamos o uso de minificação e otimização nas comparações para ter uma performance parecida com a de lançamento. Para conferir um exemplo de código, consulte o Projeto de exemplo de comparativo (link em inglês).

Cobertura de código

Recomendamos executar comparações com a cobertura desativada e sem mangling de nenhuma biblioteca ou DEX por ferramentas como a JaCoCo.

Por esse motivo, recomendamos isolar as comparações como um conjunto de origem de outros testes de instrumentação e criá-las separadamente com as dependências da versão. Isso evita a necessidade de criar testes mais de uma vez, com e sem cobertura.

As variantes de depuração das bibliotecas de que seu comparativo depende, principalmente as criadas localmente, podem ser criadas com a cobertura ativada.

Executar seus testes

Você pode executar os testes na linha de comando e especificar as classes de execução, conforme mostrado neste exemplo:

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

Para configurar a biblioteca Microbenchmark durante a execução sem o Gradle, consulte Argumentos de instrumentação da Microbenchmark.