Executar comparativos na integração contínua

É comum executar testes em CI sem o Gradle ou localmente se você estiver usando um sistema de compilação diferente. Este tópico explica como configurar a biblioteca Benchmark no tempo de execução sem o Gradle.

Para saber por que os comparativos de mercado são úteis no CI e como usar os dados do comparativo para detectar regressões, consulte Como combater regressões com os comparativos de mercado em CI (em inglês) no Blog de desenvolvedores Android.

Resultados

O comparativo de mercado gera um arquivo JSON com resultados e metadados de uma execução de teste. Esse arquivo JSON é gravado no armazenamento externo do dispositivo. É necessário extrair o arquivo do dispositivo a cada execução.

A saída está desativada por padrão, mas é possível ativá-la com o seguinte argumento de instrumentação, transmitido para o comando am instrument:

-e androidx.benchmark.output.enable true

Por padrão, os relatórios são salvos no dispositivo no diretório de downloads do armazenamento externo do app testado, que pode ser encontrado com a seguinte consulta:

adb shell content query --uri content://media/external/file --projection _data --where "\"_data LIKE '%Android'\""

É possível configurar o caminho das gravações de comparativo de mercado usando o seguinte argumento de instrumentação:

-e additionalTestOutputDir "device_path_you_can_write_to"

Armazenamento e Android 10

Se, como no Android Gradle, for difícil extrair dados de saída do dispositivo antes de um teste ser desinstalado, é possível transmitir o argumento de instrumentação a seguir. Em dispositivos com Android 10 e versões mais recentes, esse argumento permite que os arquivos continuem existindo após a desinstalação:

-e no-isolated-storage 1

Se você também estiver direcionando para a API 29 e versões mais recentes, também será necessário permitir explicitamente as opções de armazenamento de legado no manifesto do comparativo de mercado:

<application android:requestLegacyExternalStorage="true" ... >

Para mais informações, consulte Desativar temporariamente o armazenamento com escopo.

Bloquear clocks

O plug-in do Gradle de comparativo de mercado fornece o comando ./gradlew lockClocks para bloquear os clocks da CPU de um dispositivo com acesso root. Isso é útil para garantir que há estabilidade em dispositivos com acesso root, como as versões "userdebug". É possível replicar isso com o script de shell lockClocks.sh, disponível na origem da biblioteca.

É possível executar o script diretamente de um host Linux ou Mac ou enviar para o dispositivo com alguns comandos adb:

adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
adb shell /data/local/tmp/lockClocks.sh
adb shell rm /data/local/tmp/lockClocks.sh

Se você executar o script de shell diretamente em um host, ele enviará esses comandos para um dispositivo conectado.

Argumentos de instrumentação

Configure o comportamento da biblioteca usando os argumentos de instrumentação abaixo:

androidx.benchmark.startupMode.enable (experimental),

  • Reconfigura o comportamento de repetição para oferecer suporte ao código de comparação durante a inicialização
  • Desativa a repetição de aquecimento
  • Captura 10 medidas
  • Desativa a média de repetição, o que minimiza a sobrecarga em microcomparativos
  • O valor padrão é false.

androidx.benchmark.output.enable

  • Permite gravar o arquivo JSON de resultado no armazenamento externo
  • O valor padrão é true.

androidx.benchmark.suppressErrors

  • Lista de erros separados por vírgula, como DEBUGGABLE,LOW-BATTERY, para transformar em alertas
  • O padrão é uma lista vazia

androidx.benchmark.profiling.mode

  • Um destes: None, MethodTracing ou StackSampling (não diferenciam maiúsculas de minúsculas)
  • O valor padrão é None.
  • Para mais informações, consulte Criação de perfil.

androidx.benchmark.profiling.sampleFrequency

  • Número de amostras de pilha a serem capturadas por segundo no modo de criação de perfil StackSampling.
  • O padrão é de 1000 amostras por segundo.
  • Para mais informações, consulte Criação de perfil.

androidx.benchmark.profiling.sampleDurationSeconds

  • Duração da comparação a ser executada no modo de criação de perfil StackSampling.
  • O padrão é de 5 segundos.
  • Para mais informações, consulte Criação de perfil.

additionalTestOutputDir

  • Configura onde os relatórios de comparativo de mercado JSON e os resultados de criação de perfil são salvos no dispositivo.
  • O padrão é testar o diretório de download externo do APK