Criar microcomparações sem o Gradle

Embora a biblioteca Microbenchmark use um plug-in do Gradle para ser integrada diretamente ao Plug-in do Android para Gradle, você também pode usá-la em outros sistemas de compilação, como Bazel ou Buck (link em inglês).

Este tópico descreve como configurar um sistema de compilação que não seja o Gradle com a biblioteca Microbenchmark.

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 a sinalização depurável não for definida corretamente, a biblioteca vai emitir um erro em vez de informar resultados inválidos. Essa configuração pode precisar ser ativada 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 que instrumente outro APK.

APKs com autoinstrumentação

Com um APK com autoinstrumentação simples, como saída de Gradle para um diretório androidTest de com.android.library, o manifesto do Android de um único APK precisa estar com a opção depurável desativada:

<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

Caso sua versão gere dois APKs, um de app e um de teste (conforme a saída de Gradle para um diretório androidTest de com.android.app), o APK do app precisa ser definido como debuggable=false. A sinalização depurável do APK de teste é ignorada pelo sistema operacional Android.

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

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

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

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

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

Minificação e otimização

Recomendamos o uso de minificação e otimização das comparações para ter um desempenho mais próximo ao do lançamento. Para um exemplo de código, consulte o Projeto de exemplo de comparativo (em inglês).

Cobertura de código

As comparações precisam ser executadas com a cobertura desativada, sem mangling de nenhuma biblioteca ou DEX por ferramentas como a Jacoco.

Por isso, recomendamos que as comparações sejam um conjunto de origem completamente isolado de outros testes de instrumentação e criadas separadamente com as dependências da versão. Isso evita a necessidade de criar testes mais de uma vez: com e sem cobertura.

Também é importante observar que as variantes de depuração das bibliotecas de que seu comparativo de mercado depende, especialmente aquelas construídas localmente, podem ser criadas com a cobertura ativada.

Como executar

Você pode executar seus testes na linha de comando e especificar as classes com que serão executados.

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

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