Solução de problemas e perguntas frequentes sobre o Crashlytics


Nesta página, você vai encontrar respostas para perguntas frequentes sobre como usar o Crashlytics e ajuda para solucionar problemas. Caso não encontre o que procura ou precise de ajuda, entre em contato com o suporte do Firebase.

Solução de problemas gerais/perguntas frequentes

Talvez sejam exibidos dois formatos diferentes para os problemas listados na tabela Problemas no console do Firebase. Pode ser que você também se depare com um recurso chamado "variantes" em alguns dos seus problemas. Confira abaixo porque isso acontece.

No início de 2023, lançamos um mecanismo de análise aprimorado para agrupar eventos, além de um design atualizado e alguns recursos avançados para novos problemas, como variantes. Confira nossa última postagem do blog para saber de todos os detalhes ou confira os destaques abaixo.

O Crashlytics analisa todos os eventos do seu app (como falhas, erros não fatais e ANRs) e cria grupos de eventos chamados problemas. Todos os eventos de um problema têm um ponto de falha comum.

Para agrupar eventos nesses problemas, o mecanismo de análise aprimorado analisa muitos aspectos do evento, incluindo os frames no stack trace, a mensagem de exceção, o código do erro e outras características da plataforma ou do tipo de erro.

No entanto, dentro de um grupo de eventos, os stack traces que levam à falha podem ser diferentes. Um stack trace diferente pode significar uma causa raiz diferente. Para representar essa possível diferença em um problema, agora criamos variantes. Cada variante é um subgrupo de eventos em um problema que tem o mesmo ponto de falha e um stack trace semelhante. Com as variantes, é possível depurar os stack traces mais comuns em um problema e determinar se diferentes causas raiz estão causando a falha.

Confira o que mudou com essas melhorias:

  • Metadados reformulados na linha do problema
    Agora ficou mais fácil entender e filtrar problemas no seu app.

  • Menos problemas duplicados
    Uma mudança no número da linha não resulta em um novo problema.

  • Depuração mais fácil de problemas complexos com várias causas raiz
    Use variantes para depurar os stack traces mais comuns em um problema.

  • Alertas e indicadores mais significativos
    Um novo problema representa um novo bug.

  • Pesquisa mais avançada
    Cada problema contém metadados mais pesquisáveis, como tipo de exceção e nome do pacote.

Confira como essas melhorias estão sendo lançadas:

  • Quando novos eventos do seu app são recebidos, verificamos se eles correspondem a um problema existente.

  • Se não houver correspondência, vamos aplicar automaticamente ao evento nosso algoritmo de agrupamento de eventos mais inteligente e criaremos um novo problema com o design de metadados reformulado.

Essa é a primeira grande atualização que estamos fazendo no nosso agrupamento de eventos. Se você tiver feedback ou encontrar algum problema, preencha um relatório.

Caso nenhuma métrica sem falha (como usuários e sessões sem falhas) e/ou alerta de velocidade seja exibido, veja se você está usando o SDK do Crashlytics v18.6.0+ (ou Firebase BoM v32.6.0+).

Caso nenhum registro de navegação estrutural apareça, veja a configuração do Google Analytics no seu app. Verifique se você atende aos seguintes requisitos:

O Crashlytics oferece suporte à geração de relatórios de ANR para apps Android em dispositivos que executam o Android 11 e versões mais recentes. A API usada para coletar ANRs (getHistoricalProcessExitReasons) é mais confiável do que as abordagens baseadas em SIGQUIT ou watchdog. Essa API está disponível apenas em dispositivos Android 11 ou com versões mais recentes.

Caso alguns ANRs estejam com BuildIds faltando, faça o seguinte para resolver problemas:

  • Verifique se você está usando a versão mais recente do SDK do Android para Crashlytics e do plug-in do Gradle para Crashlytics.

    Caso não encontre BuildIds para o Android 11 e alguns ANRs do Android 12, é provável que você esteja usando um SDK e/ou um plug-in do Gradle desatualizado. Para coletar BuildIds corretamente para os ANRs, é preciso usar estas versões:

    • SDK do Android para Crashlytics v18.3.5+ (Firebase BoM v31.2.2+)
    • Plug-in do Gradle para Crashlytics v2.9.4+
  • Verifique se você está usando um local não padrão para suas bibliotecas compartilhadas.

    Se os BuildIds só estiverem faltando nas bibliotecas compartilhadas do seu app, é provável que você não esteja usando o local padrão para elas. Se esse for o caso, talvez o Crashlytics não consiga localizar os BuildIds associados. Recomendamos que você use o local padrão para as bibliotecas compartilhadas.

  • Verifique se você não está removendo BuildIds durante o processo de build.

    As dicas de solução de problemas a seguir se aplicam a ANRs e também a falhas nativas.

    • Verifique se os BuildIds estão executando readelf -n nos seus programas binários. Se os BuildIds estiverem faltando, adicione -Wl,--build-id às sinalizações do sistema de build.

    • Verifique se você não está removendo BuildIds acidentalmente para reduzir o tamanho do APK.

    • Se você mantiver as versões removidas e não removidas de uma biblioteca, não se esqueça de apontar a versão correta no código.

Pode haver diferenças na contagem de ANRs do Google Play e do Crashlytics. Isso é esperado devido à diferença no mecanismo de geração de relatórios e coleta de dados de ANR. O Crashlytics registra ANRs na próxima inicialização do app, e o Android vitals envia os dados após a ocorrência dos ANRs.

Além disso, o Crashlytics só exibe ANRs que ocorrem em dispositivos com o Android 11 e versões mais recentes, e o Google Play exibe ANRs de dispositivos que têm o Google Play Services e o consentimento de coleta de dados aceito.

Os conjuntos de ferramentas LLVM e GNU têm padrões e tratamentos distintos para o segmento somente leitura dos binários do app, o que pode gerar stack traces inconsistentes no console do Firebase. Para atenuar isso, adicione as seguintes flags do vinculador ao seu processo de build:

  • Se você estiver usando o vinculador lld do conjunto de ferramentas LLVM, adicione:

    -Wl,--no-rosegment
  • Se você estiver usando o vinculador ld.gold do conjunto de ferramentas GNU, adicione:

    -Wl,--rosegment

Se você ainda estiver vendo inconsistências de stack trace (ou se nenhuma sinalização for relevante para seu conjunto de ferramentas), adicione o seguinte ao processo de compilação:

-fno-omit-frame-pointer

O plug-in do Crashlytics agrupa um gerador de arquivos de símbolo personalizados do Breakpad. Se você prefere usar seu próprio binário para gerar arquivos de símbolo do Breakpad (por exemplo, para criar os executáveis nativos da cadeia de builds direto da fonte), use a propriedade de extensão symbolGeneratorBinary opcional para especificar o caminho para o executável.

Há duas formas de especificar o caminho para o binário gerador de arquivos de símbolo do Breakpad:

  • Opção 1: especificar o caminho usando a extensão firebaseCrashlytics no arquivo build.gradle

    Adicione o seguinte ao seu arquivo build.gradle.kts no nível do app:

    android {
      buildTypes {
        release {
          configure<CrashlyticsExtension> {
            nativeSymbolUploadEnabled = true
            // Add these optional fields to specify the path to the executable
            symbolGeneratorType = "breakpad"
            breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS")
          }
        }
      }
    }
    android {
      // ...
      buildTypes {
        // ...
        release {
          // ...
          firebaseCrashlytics {
            // existing; required for either symbol file generator
            nativeSymbolUploadEnabled true
            // Add this optional new block to specify the path to the executable
            symbolGenerator {
              breakpad {
                binary file("/PATH/TO/BREAKPAD/DUMP_SYMS")
              }
            }
          }
       }
    }
  • Opção 2: especificar o caminho usando uma linha de propriedade no arquivo do Gradle

    Você pode usar a propriedade com.google.firebase.crashlytics.breakpadBinary para especificar o caminho para o executável.

    É possível atualizar o arquivo de propriedades do Gradle manualmente ou atualizar o arquivo usando a linha de comando. Por exemplo, para especificar o caminho pela linha, use um comando como este:

    ./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \
      -Pcom.google.firebase.crashlytics.breakpadBinary=/PATH/TO/BREAKPAD/DUMP_SYMS \
      app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
    

Se a exceção a seguir aparecer, você provavelmente está usando uma versão do DexGuard incompatível com o SDK do Firebase Crashlytics:

java.lang.IllegalArgumentException: Transport backend 'cct' is not registered

Essa exceção não provoca uma falha no app, mas impede o envio de relatórios de erros. Para corrigir isso, faça o seguinte:

  1. Verifique se você está usando a versão mais recente do DexGuard 8.x. Ela contém regras exigidas pelo SDK do Firebase Crashlytics.

  2. Se você não quer alterar sua versão do DexGuard, tente adicionar a linha a seguir às regras de ofuscação no arquivo de configuração do DexGuard:

    -keepresourcexmlelements manifest/application/service/meta-data@value=cct

Quando um app usa um ofuscador que não expõe a extensão do arquivo, o Crashlytics gera cada problema com uma extensão de arquivo .java por padrão.

Para que o Crashlytics possa gerar problemas com a extensão de arquivo correta, verifique se o app:

  • usa o Android para Gradle 4.2.0 ou versões mais recentes
  • usa o R8 com a ofuscação ativada. Para atualizar seu app para o R8, siga este documento.

Depois de fazer a atualização para a configuração descrita acima, é possível que novos problemas .kt que são cópias de problemas .java existentes apareçam. Consulte as Perguntas frequentes para saber mais sobre essa situação.

Em meados de dezembro de 2021, o Crashlytics melhorou o suporte para aplicativos que usam Kotlin.

Até pouco tempo, os ofuscadores disponíveis não mostravam a extensão do arquivo, por isso o Crashlytics gerava cada problema com uma extensão de arquivo .java por padrão. No entanto, a partir do Android para Gradle 4.2.0, o R8 passou a aceitar extensões de arquivos.

Com essa atualização, o Crashlytics pode determinar se cada classe usada no app foi escrita em Kotlin e incluir o nome de arquivo correto na assinatura do problema. Agora as falhas são atribuídas corretamente aos arquivos .kt (como apropriado) quando o app tem a seguinte configuração:

  • O app usa o Android para Gradle 4.2.0 ou com versão mais recente.
  • O app usa o R8 com a ofuscação ativada.

Como as novas falhas agora incluem a extensão de arquivo correta nas assinaturas dos problemas, podem aparecer novos problemas .kt que são apenas cópias dos problemas .java que já existem. No console do Firebase, tentamos identificar e informar você quando um novo problema .kt é uma possível cópia de um problema .java que já existe.

Com as observações, os membros do projeto podem comentar sobre problemas específicos com perguntas, atualizações de status etc.

Quando um membro do projeto posta uma observação, ela é marcada com o e-mail da Conta do Google. Esse endereço de e-mail e as notas ficam visíveis para todos os membros do projeto com acesso de visualização.

Veja a seguir o acesso necessário para visualizar, gravar e excluir observações:

Consulte Noções básicas sobre métricas sem falhas.

Com as observações, os membros do projeto podem comentar sobre problemas específicos com perguntas, atualizações de status etc.

Quando um membro do projeto posta uma observação, ela é marcada com o e-mail da Conta do Google. Esse endereço de e-mail e as notas ficam visíveis para todos os membros do projeto com acesso de visualização.

Veja a seguir o acesso necessário para visualizar, gravar e excluir observações:

Integrações

Se o projeto usa Crashlytics com o SDK do Google Mobile Ads, é provável que as ferramentas de relatórios de falhas causem interferências ao registrar gerenciadores de exceções. Para corrigir o problema, desative a geração de relatórios de falhas no SDK do Mobile Ads chamando disableSDKCrashReporting.

Depois de vincular o Crashlytics ao BigQuery, os conjuntos de dados que você criar serão automaticamente localizados nos Estados Unidos, independentemente do local do seu projeto do Firebase.

Suporte a plataformas

O NDK do Firebase Crashlytics não funciona com ARMv5 (armeabi). O suporte para essa ABI foi interrompido a partir do NDK r17.

Problemas reabertos

A regressão acontece quando você encerra um problema, mas o Crashlytics recebe um relatório novo informando que ele ocorreu novamente. O Crashlytics reabre esses problemas automaticamente para que possam ser resolvidos da forma mais apropriada no seu app.

Veja um exemplo de como o Crashlytics classifica um problema como uma regressão:

  1. O Crashlytics recebe um relatório de erros sobre a falha A pela primeira vez. O Crashlytics abre um problema correspondente para essa falha (problema A).
  2. Você corrige esse bug, fecha o problema A e lança uma nova versão do seu app.
  3. O Crashlytics recebe outro relatório sobre o problema A depois que ele foi encerrado.
    • O Crashlytics não vai considerar o problema como reaberto se o relatório for de uma versão do app que o Crashlytics conhecia no momento em que o problema foi encerrado (ou seja, a versão enviou um relatório de erro para todos os erros). O problema vai permanecer encerrado.
    • O Crashlytics considera o problema como reaberto se o relatório for de uma versão do app que o Crashlytics nãoconhecia no momento em que o problema foi encerrado (ou seja, a versão nunca enviou qualquer relatório de erro).

Quando um problema é regredido, enviamos um alerta de detecção de regressão e adicionamos um sinal ao problema para informar que o Crashlytics reabriu o problema. Se você não quiser que um problema seja reaberto devido ao nosso algoritmo de regressão, "ignore" o problema em vez de fechá-lo.

O Crashlytics considera um problema como regredido se um relatório for de uma versão antiga do app que nunca enviou relatórios de erros no momento em que o problema foi encerrado.

Isso pode acontecer na seguinte situação: você corrigiu um bug e lançou uma nova versão do app, mas ainda há usuários em versões mais antigas sem a correção de bug. Se uma dessas versões mais antigas nunca tiver enviado relatórios de erros no momento em que o problema foi encerrado, e esses usuários começarem a descobrir o bug, esses relatórios de erros podem acionar um problema reaberto.

Se você não quiser que um problema seja reaberto devido ao nosso algoritmo de regressão, "ignore" o problema em vez de fechá-lo.