Rastreamento de composição

Os traces geralmente são a melhor fonte de informações ao analisar pela primeira vez um problema de performance. Eles permitem formar uma hipótese do problema e onde começar a procurar.

Há dois níveis de rastreamento com suporte do Android: rastreamento do sistema e rastreamento de método.

Como o rastreamento do sistema só rastreia áreas especificamente marcadas para rastreamento, ele tem baixa sobrecarga e não afeta muito a performance do app. O rastreamento do sistema é ótimo para ver quanto tempo determinadas seções do código levam para serem executadas.

O rastreamento de métodos acompanha todas as chamadas de função no app. Esse processo é muito caro e afeta bastante a performance do app, mas oferece uma ideia geral do que está acontecendo, quais funções estão sendo chamadas e com que frequência.

Por padrão, os rastreamentos do sistema não incluem funções de composição individuais. Elas estão disponíveis nos rastros de método.

No momento, estamos testando uma nova funcionalidade de rastreamento do sistema para mostrar funções de composição nos rastreamentos do sistema. Ele oferece a baixa intrusão do rastreamento do sistema, com níveis de detalhes de rastreamento de método na composição.

Configurar o rastreamento de composição

Para testar o rastreamento de recomposição no seu projeto, é necessário atualizar para pelo menos as seguintes versões:

  • Android Studio Flamingo Canary 5
  • IU do Compose: 1.3.0-beta01
  • Compose Compiler: 1.3.0

O dispositivo ou emulador em que você executa o trace também precisa estar no mínimo no nível 30 da API.

Além disso, será necessário adicionar uma nova dependência ao Compose Runtime Tracing:

implementation("androidx.compose.runtime:runtime-tracing:1.0.0-alpha01")

Com essa dependência, ao ver um rastro do sistema que inclui a recomposição, você automaticamente verá as funções de composição.

Fazer um rastreamento do sistema

Para fazer um rastreamento do sistema e ver o novo rastreamento de recomposição em ação, siga estas etapas:

  1. Abra o criador de perfil:

    Android Studio: Start Profiling
    Figura 2. Android Studio: Start Profiling
  2. Clique em CPU timeline.

    Criador de perfil do Android Studio: CPU timeline
    Figura 3. Criador de perfil do Android Studio: CPU timeline
  3. Navegue até a IU que você quer rastrear e selecione System Trace e Record.

    Opções de rastreamento: rastreamento do sistema
    Figura 4. Opções de rastreamento: rastreamento do sistema
  4. Use o app para fazer a recomposição e interromper a gravação. Depois que o rastro é processado e mostrado, é possível conferir os elementos de composição no rastreamento de recomposição. Você pode usar o teclado e o mouse para aplicar zoom e movimentar o rastro. Se não souber navegar por um rastro, consulte a documentação Gravar rastros.

    Rastreamento do sistema
    Figura 5. Rastreamento do sistema

    Clique duas vezes em um elemento de composição no gráfico para acessar o código-fonte.

  5. Também é possível ver as funções de composição no Flame Chart, além do arquivo e do número da linha:

    Flame Chart
    Figura 6. Flame Chart

Avisos

Sobrecarga de tamanho do APK

Nosso objetivo é minimizar ao máximo a sobrecarga do recurso. Há um aumento no tamanho do APK para apps do Compose provenientes do rastreamento de strings incorporadas no APK pelo compilador do Compose. Esse aumento de tamanho pode ser relativamente pequeno se o app não estiver usando o Compose ou for maior para apps completos do Compose. Essas strings de rastreamento também são desofuscadas para que possam aparecer em ferramentas de rastreamento, conforme mostrado acima. O compilador do Compose as injeta em todos os apps a partir da versão 1.3.0.

As strings de rastreamento podem ser removidas no build de produção adicionando a seguinte regra do ProGuard:


-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

Essas funções podem mudar no futuro, mas qualquer mudança vai ser mencionada nas notas da versão do Compose.

Manter esses APKs e, ao mesmo tempo, gerar custos de tamanho de APK, garante que o APK com o perfil que está sendo criado seja o mesmo que os usuários do app executam.

Tempo preciso

Para a criação de perfis precisos, como em qualquer teste de performance, é necessário tornar o app profileable / non-debuggable de acordo com os aplicativos com perfil.

Como capturar um rastro do terminal

É possível capturar um rastro de composição do terminal. Para fazer isso, você precisa realizar as etapas que o Android Studio normalmente executa de forma automática.

Adicionar dependências

Primeiro, adicione as outras dependências ao seu app.

implementation("androidx.compose.runtime:runtime-tracing:<latest-version>")
implementation("androidx.tracing:tracing-perfetto:<latest-version>")
implementation("androidx.tracing:tracing-perfetto-binary:<latest-version>")

Gerar um comando de gravação

  1. Gere um comando de gravação no Perfetto.
  2. Adicione a seção da fonte de dados "track_event" manualmente, conforme o exemplo abaixo.

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    
    EOF
    

Capturar rastros

  1. Primeiro, inicie o app e prepare a seção que você quer rastrear.
  2. Depois, emita uma transmissão para ativar o rastreamento no app.

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
        -a androidx.tracing.perfetto.action.ENABLE_TRACING \
        $package/androidx.tracing.perfetto.TracingReceiver
    
  3. Por fim, inicie o comando de gravação que você criou acima.

Abrir o rastro

  1. Local adb pull <location> do rastro do dispositivo (especificado no comando de gravação).

  2. Abra o rastro no Perfetto.

Feedback

Queremos receber seu feedback sobre esse recurso, os bugs que você encontrar e as solicitações que você tiver. Envie feedback pelo Issue Tracker.