Comparativos de compilação sem o Gradle

Ainda que a biblioteca Benchmark forneça um plug-in do Gradle para ser integrado diretamente com o plug-in do Android para Gradle, você também pode usá-la em outros sistemas de compilação, como o Bazel ou Buck (links em inglês).

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

AndroidBenchmarkRunner

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

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

Depurável

Para ter medições precisas, os comparativos de mercado não podem ser depuráveis. Se a sinalização depurável não for definida corretamente, a biblioteca 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.

Os comparativos de mercado podem ser criados para serem executados 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 o comparativo de mercado de um APK de módulo de app não é compatível com o Android Studio ou o 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 no seus comparativos de mercado para ter um desempenho mais próximo do lançamento. Para ver um código de exemplo, consulte o projeto de amostra de comparativo de mercado (em inglês).

Cobertura

Os comparativos de mercado precisam ser executados com a cobertura desativada, sem mangling de nenhuma biblioteca ou DEX por ferramentas como a Jacoco.

Por isso, recomendamos que os comparativos de mercado sejam um conjunto de origem completamente isolado de outros testes de instrumentação e criados separadamente com as dependências da versão. Também achamos que 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

Para configurar a biblioteca Benchmark no ambiente execução sem o Gradle, consulte Executar comparativos na integração contínua.