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.
Nessa página, você encontra informações sobre os seguintes tipos de temas:
Solução de problemas gerais, incluindo dúvidas sobre exibição de dados ou trabalho com dados no console do Firebase e dúvidas sobre problemas regredidos.
Suporte específico da plataforma, incluindo dúvidas específicas para plataformas da Apple, Android e Unity.
Suporte a integrações, incluindo dúvidas sobre BigQuery.
Solução de problemas gerais/perguntas frequentes
Formatos diferentes (às vezes, "variantes") para alguns problemas na tabela Problemas
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.
Não há registros de navegação estrutural
Se você não estiver vendo registros de navegação estrutural (iOS+ | Android | Flutter | Unity), confira a configuração do Google Analytics no seu app. Verifique se você atende aos seguintes requisitos:
Você ativou o Google Analytics no seu projeto do Firebase.
Você ativou o Compartilhamento de dados para Google Analytics. Saiba mais sobre essa configuração em Gerenciar as configurações de compartilhamento de dados do Analytics
Você adicionou ao seu app o SDK do Firebase para Google Analytics: iOS+ | Android | Flutter | Unity.
Esse SDK precisa ser adicionado além do SDK do Crashlytics.Você está usando as versões mais recentes do SDK do Firebase para todos os produtos que usa no seu app (iOS+ | Android | Flutter | Unity).
Para plataformas da Apple e apps Android, verifique principalmente se você está usando pelo menos as seguintes versões do SDK do Firebase para Google Analytics:
iOS+ — v6.3.1+ (v8.9.0+ para macOS e tvOS) |Android — v17.2.3+ (BoM v24.7.1+) .
Não há alertas de velocidade
Se você não estiver recebendo alertas de velocidade, verifique se está usando o
As métricas sem falhas não aparecem (ou aparecem métricas não confiáveis)
Se você não estiver vendo métricas sem falhas (como usuários e sessões sem falhas) ou métricas não confiáveis, verifique o seguinte:
Verifique se você está usando o
Verifique se as configurações de coleta de dados não estão afetando a qualidade das métricas sem falhas:
Se você ativar a geração de relatórios desativando os relatórios automáticos de erros, as informações de falhas só poderão ser enviadas para Crashlytics de usuários que aceitaram explicitamente a coleta de dados. Assim, a precisão das métricas sem falhas será afetada, já que Crashlytics só tem informações de falhas desses usuários (em vez de todos). Isso significa que as métricas sem falhas podem ser menos confiáveis e menos representativas da estabilidade geral do app.
Se a coleta automática de dados estiver desativada, use
sendUnsentReportspara enviar relatórios em cache no dispositivo para Crashlytics. O uso desse método vai enviar dados de crash para Crashlytics, mas não dados de sessões, o que faz com que os gráficos do console mostrem valores baixos ou zero para métricas sem falhas.
Como a porcentagem de usuários sem falhas é calculada?
Consulte Noções básicas sobre métricas sem falhas.
Quem pode ver, escrever e excluir notas sobre um problema?
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:
Os membros do projeto com qualquer um dos papéis a seguir podem ver e excluir as notas existentes, além de escrever novas notas sobre um problema.
Os membros do projeto com qualquer um dos papéis a seguir podem ver as notas postadas em um problema, mas não podem excluir ou escrever uma nota.
- Leitor do projeto, leitor do Firebase, visualizador de qualidade ou Leitor do Crashlytics
O que é um problema regredido?
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:
- 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).
- Você corrige esse bug, fecha o problema A e lança uma nova versão do seu app.
- 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.
Por que estão aparecendo problemas regredidos de versões mais antigas do app?
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 anteriores sem a correção de bug. Se uma dessas versões anteriores 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.
Suporte específico da plataforma
As seções a seguir oferecem suporte para solução de problemas e perguntas frequentes específicas da plataforma: iOS+ | Android | Unity.
Suporte para plataformas da Apple
Os dSYMs estão ausentes ou não estão sendo enviados
Para fazer upload dos dSYMs do seu projeto e receber resultados detalhados, verifique o seguinte:
Verifique se a fase de build do seu projeto contém o script de execução do Crashlytics, que permite que o Xcode faça upload dos dSYMs do projeto no tempo de build. Acesse Como inicializar o Crashlytics para ver instruções sobre como adicionar o script. Depois de atualizar seu projeto, force uma falha e confirme se ela aparece no painel do Crashlytics.
Se o alerta dSYM ausente aparecer no console do Firebase verifique o Xcode para garantir que ele está produzindo dSYMs corretamente para o build.
Se o Xcode estiver produzindo dSYMs adequadamente e a mensagem de dSYMs ausentes continuar a aparecer, pode ser que a ferramenta de script de execução esteja bloqueada durante o upload dos dSYMs. Nesse caso, tente seguir estas etapas:
Verifique se você está usando a versão mais recente do Crashlytics.
Faça upload manual dos arquivos dSYM ausentes:
- Opção 1: use a opção "Arrastar e soltar" baseada no console na guia dSYMs para fazer upload de um arquivo ZIP contendo os arquivos dSYM ausentes.
- Opção 2: use o
script
upload-symbolspara fazer upload dos arquivos dSYM ausentes nos UUIDs fornecidos nodSYMs guia.
Se você continuar vendo dSYMs ausentes ou se os uploads ainda não tiverem sido concluídos, entre em contato com o Suporte do Firebase e inclua seus registros.
Falhas mal simbolizadas
Caso os stack traces pareçam estar mal simbolizados, verifique os seguintes dados:
Se os quadros da biblioteca do app não têm referências ao código do app, verifique se
não está definido como uma sinalização de compilação.-fomit-frame-pointerSe vários frames
(Missing)aparecerem para a biblioteca do seu app, veja se há dSYMs opcionais listados como ausentes (para a versão do app afetada) na guia dSYMs do Crashlytics do console do Firebase. Em caso afirmativo, siga a etapa da solução de problemas Alerta de dSYM ausente nas Perguntas frequentes sobre dSYMs ausentes ou sem upload nesta página. O upload desses dSYMs não simboliza falhas que já ocorreram, mas ajuda a garantir a simbolização de falhas futuras.
Posso usar o Crashlytics para macOS ou tvOS?
Sim, o Crashlytics pode ser implementado em projetos para macOS e tvOS. Inclua a v8.9.0 ou a versão mais recente do SDK do Firebase para Google Analytics para que as falhas tenham acesso às métricas coletadas pelo Google Analytics (usuários sem falhas, versão mais recente, alertas de velocidade e registros de navegação estrutural).
Posso usar o Crashlytics em um projeto do Firebase com vários apps em diferentes plataformas da Apple?
Agora você pode informar falhas de vários apps em um único projeto do Firebase, mesmo quando eles são criados para diferentes plataformas da Apple (por exemplo, iOS, tvOS e Mac Catalyst). Antes, você precisava separar os apps em projetos individuais do Firebase se eles tivessem o mesmo ID de pacote.
Suporte para Android
Por que os ANRs são informados apenas para o Android 11 e versões mais recentes?
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.
Por que alguns ANRs não têm
BuildIds?
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 coletarBuildIds 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 osBuildIds 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 executandoreadelf -nnos seus programas binários. Se osBuildIds 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.
Diferenças entre os relatórios de ANR no painel do Crashlyticse no Google Play Console
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.
Por que vejo falhas
em arquivos .kt marcadas como problemas .java?
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.
Por que aparecem
problemas .kt que são cópias de problemas
.java que já existem?
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.
Não estou recebendo relatórios de falhas com o Dexguard
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:
Verifique se você está usando a versão mais recente do DexGuard 8.x. Ela contém regras exigidas pelo SDK do Firebase Crashlytics.
Se você não quiser alterar sua versão do DexGuard, tente adicionar esta linha às regras de ofuscação no arquivo de configuração do DexGuard:
-keepresourcexmlelements manifest/application/service/meta-data@value=cct
Como fazer upgrade para o plug-in do Gradle para Crashlytics v3?
A versão mais recente do plug-in do Gradle para Crashlytics é uma das versões principais do Google (v3.0.0) e moderniza o SDK eliminando o suporte a versões anteriores do Gradle e do Plug-in do Android para Gradle. Além disso, as mudanças nesta versão resolvem problemas com o AGP v8.1+ e melhoram o suporte a apps nativos e builds personalizados.
Requisitos mínimos
O plug-in do Gradle para Crashlytics v3 tem os seguintes requisitos mínimos:
Plug-in do Android para Gradle 8.1+
Atualize o plug-in usando o Assistente de upgrade do Plug-in do Android para Gradle na versão mais recente do Android Studio.Plug-in
google-servicesdo Firebase para Gradle 4.4.1+
Faça upgrade do plug-in especificando a versão mais recente no arquivo de build do Gradle do seu projeto desta forma:
Kotlin
plugins { id("com.android.application") version "8.1.4" apply false id("com.google.gms.google-services") version "4.4.4" apply false ... }
Groovy
plugins { id 'com.android.application' version '8.1.4' apply false id 'com.google.gms.google-services' version '4.4.4' apply false ... }
Mudanças na extensão do Crashlytics
Com a v3 do plug-in do Gradle para Crashlytics, a extensão do Crashlytics tem estas alterações interruptivas:
A extensão foi removida do bloco do Android
defaultConfig. Em vez disso, precisa configurar cada variante.O campo descontinuado
mappingFilefoi removido. Em vez disso, o arquivo de mapeamento mesclado é fornecido automaticamente.O campo descontinuado
strippedNativeLibsDirfoi removido. Em vez disso, useunstrippedNativeLibsDirpara todas as bibliotecas nativas.O campo
unstrippedNativeLibsDirfoi mudado para ser cumulativo.Ver um exemplo com vários diretórios
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("MY/NATIVE/LIBS") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS") } } } }
A tarefa
só vai fazer upload dos símbolos emuploadCrashlyticsSymbolFilesBasicReleaseMY/NATIVE/LIBS, mas vai fazer upload dos símbolos ambosuploadCrashlyticsSymbolFilesFeatureXReleaseMY/NATIVE/LIBSeMY/FEATURE_X/LIBS.O campo de interdição
symbolGeneratorfoi substituído por dois novos campos de nível superior:symbolGeneratorType, uma string de"breakpad"(padrão) ou"csym":breakpadBinary, um arquivo de uma substituição binária local dedump_syms.
Exemplo de como fazer upgrade da extensão
Kotlin
| Antes |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGenerator( closureOf<SymbolGenerator> { symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } ) } } } |
| Agora na v3 |
buildTypes { release { configure<CrashlyticsExtension> { // ... symbolGeneratorType = "breakpad" breakpadBinary = file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Groovy
| Antes |
buildTypes { release { firebaseCrashlytics { // ... symbolGenerator { breakpad { binary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } } } |
| Agora na v3 |
buildTypes { release { firebaseCrashlytics { // ... symbolGeneratorType "breakpad" breakpadBinary file("/PATH/TO/BREAKPAD/DUMP_SYMS") } } } |
Suporte específico para Android NDK
Diferenças entre os stack traces do NDK no painel do Crashlytics e no logcat
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
llddo conjunto de ferramentas LLVM, adicione:-Wl,--no-rosegmentSe você estiver usando o vinculador
ld.golddo 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-pointerComo usar meu próprio binário para NDK gerador de arquivos de símbolo do Breakpad?
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
firebaseCrashlyticsno arquivobuild.gradleAdicione o seguinte ao seu arquivo
build.gradle.ktsno nível do app:Plug-in para Gradle v3.0.0 ou mais recente
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") } } } }
versões anteriores do plug-in
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.breakpadBinarypara 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
O Crashlytics oferece suporte ao armeabi?
O NDK do Firebase Crashlytics não funciona com ARMv5 (armeabi). A compatibilidade com essa ABI foi removida a partir do NDK r17.
Suporte do Unity
Stack traces não simbolizados em apps Android estão aparecendo no painel do Crashlytics
Se você estiver usando o IL2CPP do Unity e encontrar stack traces não simbolizados, faça o seguinte:
Verifique se você está usando a versão 8.6.1 ou mais recente do SDK do Crashlytics para Unity.
Verifique se você configurou e está executando o comando
crashlytics:symbols:uploadda CLI do Firebase para gerar e fazer upload do arquivo de símbolo.Esse comando da CLI precisa ser executado sempre que você criar um build de lançamento ou qualquer build com stack traces que você queira ver simbolizados no console do Firebase. Saiba mais em Receber relatórios de erros legíveis.
O Crashlytics pode ser usado com apps que usam IL2CPP?
Sim, o Crashlytics pode exibir stack traces simbolizados para seus apps que usam IL2CPP. Esse recurso está disponível para apps lançados em plataformas Android ou Apple. Veja o que você precisa fazer:
Verifique se você está usando a versão 8.6.0 ou mais recente do SDK do Crashlytics para Unity.
Conclua as tarefas necessárias para sua plataforma:
Para apps da plataforma Apple: nenhuma ação especial é necessária. Para apps da plataforma Apple, o plug-in do Editor do Firebase para Unity configura automaticamente seu projeto do Xcode para fazer upload dos símbolos.
Para apps Android: verifique se você configurou e está executando o comando
crashlytics:symbols:uploadda CLI do Firebase para gerar e fazer upload do arquivo de símbolo.Esse comando da CLI precisa ser executado sempre que você criar um build de lançamento ou qualquer build com stack traces que você queira ver simbolizados no console do Firebase. Saiba mais em Receber relatórios de erros legíveis.
Como informar exceções não capturadas como fatais
O Crashlytics pode relatar exceções não capturadas como fatais (a partir da v10.4.0 do SDK do Unity). As perguntas frequentes a seguir ajudam a explicar a lógica e as práticas recomendadas para usar esse recurso.
Por que um app deve informar exceções não capturadas como fatais?
Ao informar exceções não identificadas como fatais, você tem uma indicação mais realista de quais exceções podem resultar na impossibilidade de jogar o jogo, mesmo que o app continue em execução.
Se você começar a informar erros fatais, a porcentagem de usuários sem falhas (CFU, na sigla em inglês) provavelmente vai diminuir, mas a métrica de CFU será mais representativa das experiências dos usuários finais com seu app.
Quais exceções serão reportadas como fatais?
Para que o Crashlytics informe uma exceção não identificada como fatal, as duas condições a seguir precisam ser atendidas:
Durante a inicialização do app, a propriedade
ReportUncaughtExceptionsAsFatalprecisa ser definida comotrue.Seu app (ou uma biblioteca incluída) gera uma exceção que não é capturada. Uma exceção que é criada, mas não lançada, não é considerada não capturada.
Depois de ativar os relatórios de exceções não capturadas como fatais, agora tenho muitos novos erros fatais. Como lidar corretamente com essas exceções?
Quando você começar a receber relatórios de exceções não capturadas como fatais, confira algumas opções para processar essas exceções:
- Pense em como começar a capturar e processar as exceções não capturadas.
- Considere opções diferentes para registrar exceções no console de depuração do Unity e no Crashlytics.
Detectar e processar exceções geradas
Exceções são criadas e geradas para refletir estados inesperados ou excepcionais. Resolver os problemas refletidos por uma exceção gerada envolve retornar o programa a um estado conhecido (processo conhecido como processamento de exceções).
A prática recomendada é capturar e processar todas as exceções previstas, a menos que o programa não possa retornar a um estado conhecido.
Para controlar quais tipos de exceções são capturadas e processadas por código,
una o código que pode gerar uma exceção em um bloco try-catch.
Verifique se as condições nas instruções catch são as mais restritas
possíveis para processar as exceções específicas de maneira adequada.
Registrar exceções no Unity ou no Crashlytics
Há várias formas de registrar exceções no Unity ou no Crashlytics para ajudar a depurar o problema.
Ao usar o Crashlytics, confira as duas opções mais comuns e recomendadas:
Opção 1: mostrar no console do Unity, mas não informar ao Crashlytics durante o desenvolvimento ou a solução de problemas
- Mostre no console do Unity usando
Debug.Log(exception),Debug.LogWarning(exception)eDebug.LogError(exception), que mostram o conteúdo da exceção e não geram a exceção outra vez.
- Mostre no console do Unity usando
Opção 2: fazer upload para o Crashlytics para gerar relatórios consolidados no painel do Crashlytics nestas situações:
- Se vale a pena registrar uma exceção para depurar um possível
evento do Crashlytics subsequente, use
Crashlytics.Log(exception.ToString()). - Caso uma exceção ainda precise ser informada ao Crashlytics mesmo
que tenha sido capturada e processada, use
Crashlytics.LogException(exception)para registrá-la como um evento não fatal.
- Se vale a pena registrar uma exceção para depurar um possível
evento do Crashlytics subsequente, use
No entanto, se você quiser relatar manualmente um evento fatal para o Cloud
Diagnostics do Unity, use Debug.LogException. Essa opção exibe a exceção
no console do Unity, como a opção 1, mas também gera a exceção,
mesmo que ela ainda não tenha sido gerada ou capturada. Ele gera o erro de modo não local. Isso significa que mesmo um Debug.LogException(exception)
circundante com blocos try-catch ainda resulta em uma exceção não capturada.
Portanto, chame Debug.LogException apenas se você quiser fazer todas as ações a seguir:
- Mostrar a exceção no console do Unity.
- Fazer upload da exceção para o Crashlytics como um evento fatal.
- Para gerar a exceção, trate-a como uma exceção não capturada e faça com que ela seja informada ao Cloud Diagnostics do Unity.
Para mostrar uma exceção capturada no console do Unity e fazer upload para o Crashlytics como um evento não fatal, faça o seguinte:
try
{
methodThatThrowsMyCustomExceptionType();
}
catch(MyCustomExceptionType exception)
{
// Print the exception to the Unity console at the error level.
Debug.LogError(exception);
// Upload the exception to Crashlytics as a non-fatal event.
Crashlytics.LogException(exception); // not Debug.LogException
//
// Code that handles the exception
//
}
Suporte a integrações
O app também usa o SDK do Google Mobile Ads, mas não está recebendo relatórios de falhas
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.
Onde está meu conjunto de dados do BigQuery?
O Firebase exporta dados para o local do conjunto de dados selecionado ao configurar a exportação de dados para o BigQuery.
Esse local se aplica ao conjunto de dados Crashlytics e ao conjunto de dados de sessões do Firebase (se os dados de sessões estiverem ativados para exportação).
Esse local é aplicável apenas aos dados exportados para BigQuery e não afeta o local dos dados armazenados para uso no painel Crashlytics do console Firebase ou no Android Studio.
Depois que um conjunto de dados é criado, o local não pode ser alterado, mas é possível copiar o conjunto para um local diferente ou mover (recriar) manualmente o conjunto em um local diferente. Para saber mais, consulte Mudar o local das exportações atuais.
Como fazer upgrade para a nova infraestrutura de exportação do BigQuery?
Em meados de outubro de 2024, a Crashlytics lançou uma nova infraestrutura para a exportação em lote de dados de Crashlytics para BigQuery.
Se você ativou a exportação em lote depois de outubro de 2024, seu projeto do Firebase usa automaticamente a nova infraestrutura de exportação. Nenhuma ação é necessária.
Se você ativou a exportação em lote antes ou durante outubro de 2024, confira as informações nesta seção de perguntas frequentes para determinar se é necessário fazer algo.
Todos os Projeto do Firebase serão atualizados automaticamente para a nova infraestrutura de exportação em lote a partir de 9 de janeiro de 2026. Você pode fazer upgrade antes dessa data, mas verifique se as tabelas de lote BigQuery atendem aos pré-requisitos para upgrade.
Você pode fazer upgrade para a nova infraestrutura, mas verifique se as tabelas de lote BigQuery atendem aos pré-requisitos para upgrade.
Determinar se você está na nova infraestrutura
Se você ativou a exportação em lote em meados de outubro de 2024 ou mais tarde, seu projeto do Firebase usa automaticamente a nova infraestrutura de exportação.
É possível verificar qual infraestrutura seu projeto está usando:
acesse o console Google Cloud. Se a
"Configuração de transferência de dados"
estiver marcada como Firebase Crashlytics with Multi-Region Support, seu
projeto está usando a nova infraestrutura de exportação.
Diferenças importantes entre a infraestrutura de exportação antiga e a nova
Essa nova infraestrutura oferece suporte a conjuntos de dados do Crashlyticsde locais fora dos Estados Unidos.
Exportação ativada antes de meados de outubro de 2024 e upgrade para a nova infraestrutura de exportação: agora é possível mudar o local da exportação de dados.
Exportação ativada em meados de outubro de 2024 ou mais tarde: durante a configuração você foi solicitado a selecionar um local para a exportação de dados.
A nova infraestrutura não oferece suporte a preenchimentos de dados antes de você ativar a exportação.
A infraestrutura antiga oferecia suporte a preenchimentos de até 30 dias antes da data em que você ativou a exportação.
A nova infraestrutura oferece suporte a preenchimentos de até 30 dias ou da data mais recente em que você ativou a exportação para BigQuery (o que for mais recente).
A nova infraestrutura nomeia as tabelas de lote BigQuery usando os identificadores definidos para seus apps do Firebase no projeto do Firebase.
A infraestrutura antiga gravava dados em tabelas de lote com nomes baseados nos IDs ou nomes de pacote no binário do app.
A nova infraestrutura grava dados em tabelas de lote com nomes com base nos IDs ou nomes de pacote definidos para os apps do Firebase registrados no seu projeto do Firebase.
Etapa 1: pré-requisito para a atualização
Verifique se as tabelas de lote BigQuery atuais usam identificadores correspondentes aos IDs ou nomes de pacote definidos para os apps do Firebase registrados no seu projeto do Firebase. Se eles não corresponderem, talvez haja interrupções nos dados exportados em lote. A maioria dos projetos estará em um estado adequado e compatível, mas é importante verificar antes de fazer o upgrade.
Você pode encontrar todos os apps do Firebase registrados no seu projeto do Firebase no console Firebase: acesse as settings Configurações do projeto, role até o card Seus apps para ver todos os apps do Firebase e as informações deles.
Todas as tabelas de lote BigQuery estão disponíveis na página BigQuery do console Google Cloud.
Por exemplo, confira os estados ideais em que você não terá problemas com a atualização:
Você tem uma tabela de lote chamada
com_yourcompany_yourproject_IOSe um app iOS do Firebase com o ID do pacotecom.yourcompany.yourprojectregistrado no seu projeto do Firebase.Você tem uma tabela de lote chamada
com_yourcompany_yourproject_ANDROIDe um app Android do Firebase com o nome de pacotecom.yourcompany.yourprojectregistrado no seu projeto do Firebase.
Se você tiver nomes de tabelas de lote que não correspondem aos identificadores definidos para seus apps do Firebase registrados, siga as instruções mais adiante nesta página antes de fazer o upgrade manual ou antes de 9 de janeiro de 2026 para evitar interrupções na exportação em lote.
Etapa 2: fazer upgrade manual para a nova infraestrutura
Se você tiver ativado a exportação em lote antes de meados de outubro de 2024, poderá fazer upgrade manualmente para a nova infraestrutura simplesmente desativando e ativando a exportação de dados Crashlytics no console Firebase.
Veja as etapas detalhadas:
No console do Firebase, acesse a guia Integrações.
No card do BigQuery, clique em Gerenciar.
Desative o controle deslizante Crashlytics para desativar a exportação. Quando solicitado, confirme que você quer interromper a exportação de dados.
Ative imediatamente o controle deslizante Crashlytics para reativar a exportação. Quando solicitado, confirme que você quer exportar os dados.
A exportação de dados de Crashlytics para BigQuery agora usa a nova infraestrutura de exportação.
O nome da tabela de lote atual não corresponde ao identificador do app do Firebase
Se o nome da tabela de lote atual não corresponder ao ID ou nome do pacote definido para o app do Firebase registrado, abra esta seção e implemente uma das opções para evitar interrupções nos dados de lote exportados.
Se você tiver tabelas de lote BigQuery nesse estado, isso significa que elas não são compatíveis com a nova infraestrutura de exportação em lote para BigQuery do Firebase. Todos os projetos do Firebase serão migrados automaticamente para a nova infraestrutura de exportação a partir de 9 de janeiro de 2026.
Siga as orientações desta seção antes de fazer upgrade manualmente ou até 9 de janeiro de 2026 para evitar interrupções na exportação em lote dos dados de Crashlytics para BigQuery.
Acesse as instruções sobre opções para evitar interrupções
Entenda como a infraestrutura de exportação usa identificadores para gravar dados em tabelas BigQuery
Confira como as duas infraestruturas de exportação gravam dados de Crashlytics em tabelas de lote BigQuery:
Infraestrutura de exportação legada: grava dados em uma tabela com um nome baseado no ID ou no nome do pacote no binário do app.
Nova infraestrutura de exportação: grava dados em uma tabela com um nome baseado no ID ou nome do pacote definido para o app do Firebase registrado no seu projeto do Firebase.
Às vezes, o ID ou o nome do pacote no binário do app não corresponde ao ID ou ao nome do pacote definido para o app do Firebase registrado no projeto do Firebase. Isso geralmente acontece se alguém não inseriu o identificador real durante o registro do app.
O que acontece se isso não for corrigido antes do upgrade?
Se os identificadores nesses dois locais não corresponderem, o seguinte acontecerá após o upgrade para a nova infraestrutura de exportação:
Os dados Crashlytics vão começar a ser gravados em uma nova tabela de lote BigQuery, ou seja, uma nova tabela com um nome baseado no ID ou nome do pacote definido para o app do Firebase registrado no seu projeto do Firebase.
Qualquer tabela "legado" com um nome baseado no identificador no binário do app não terá mais dados gravados.
Exemplos de cenários de identificadores incompatíveis
Os nomes das tabelas de lote BigQuery são anexados automaticamente com
_IOS ou _ANDROID para indicar a plataforma do app.
| Identificadores no binário do app | Identificadores definidos para seus apps do Firebase | Comportamento legado | Comportamento após o upgrade para a nova infraestrutura de exportação |
Solução |
|---|---|---|---|---|
foo |
bar |
Grava em uma única tabela com o nome do identificador no binário
do app (foo).
|
Cria e grava em uma única tabela com o nome do
identificador definido para o app Firebase (bar).
|
Implemente a opção 1 ou 2 descritas abaixo. |
foo |
bar, qux etc. |
Grava em uma única tabela com o nome do identificador no binário
do app (foo).
|
Cria* e grava em várias tabelas com o nome dos
identificadores definidos para apps do Firebase (bar, qux,
etc.).
|
Implemente a opção 2 descrita abaixo. |
foo, baz etc. |
bar |
Grava em várias tabelas com o nome dos vários identificadores
no binário do app (foo, baz etc.)
|
Cria** e grava os dados de cada app em uma única tabela com o nome do
identificador definido para o app do Firebase (bar).
|
Nenhuma das opções pode ser implementada.
Ainda é possível diferenciar os dados de cada app na mesma
tabela usando o |
* Se o identificador no binário do app corresponder a um dos identificadores definidos para um app do Firebase, a nova infraestrutura de exportação não vai criar uma nova tabela para esse identificador. Em vez disso, ele continuará gravando dados para esse app específico. Todos os outros apps serão gravados em novas tabelas.
** Se um dos identificadores no binário do seu app corresponder ao identificador definido para o app do Firebase, a nova infraestrutura de exportação não vai criar uma nova tabela. Em vez disso, ele vai manter essa tabela e começar a gravar dados para todos os apps nela.
Opções para evitar interrupções
Para evitar interrupções, siga as instruções de uma das opções descritas abaixo antes de fazer o upgrade manual ou antes de 9 de janeiro de 2026.
OPÇÃO 1:
use a nova tabela criada pela nova infraestrutura de exportação. Você vai copiar os dados da tabela atual para a nova.No console Firebase, faça upgrade para a nova infraestrutura de exportação desativando e ativando a exportação para o aplicativo vinculado.
Essa ação cria uma nova tabela de lote com um nome baseado no ID ou nome do pacote definido para o app do Firebase registrado no seu projeto do Firebase.
No console Google Cloud, copie todos os dados da tabela legada para a nova tabela que acabou de ser criada.
Se você tiver dependências dependentes da tabela de lote, mude-as para usar a nova tabela.
OPÇÃO 2:
continue gravando na tabela atual. Para fazer isso, você vai substituir alguns padrões em uma configuração BigQuery.No console do Firebase, encontre e anote o ID do app do Firebase (por exemplo,
1:1234567890:ios:321abc456def7890) do app com o nome e o identificador da tabela de lote incompatível:
Acesse o settings Configurações do projeto e role a tela até o card Seus apps para ver todos os apps do Firebase e as informações deles.No console Firebase, faça upgrade para a nova infraestrutura de exportação desativando e ativando a exportação para o aplicativo vinculado.
Essa ação faz duas coisas:
Cria uma nova tabela de lote com um nome baseado no ID ou nome do pacote definido para o app do Firebase registrado no seu projeto do Firebase. Você vai excluir essa tabela, mas não faça isso ainda.
Cria uma BigQuery "config de transferência de dados" com a origem
Firebase Crashlytics with Multi-Region Support.
No console Google Cloud, mude a nova "Configuração de transferência de dados" para que os dados continuem sendo gravados na tabela atual:
Acesse BigQuery > Transferências de dados para conferir a "configuração de transferência de dados".
Selecione a configuração que tem a
Firebase Crashlytics with Multi-Region Supportde origem.Clique em Editar no canto superior direito.
Na seção Detalhes da fonte de dados, encontre uma lista para gmp_app_id e uma lista para client_namespace.
Em BigQuery, o ID do app do Firebase é chamado de
gmp_app_id. Por padrão, o valorclient_namespaceem BigQuery é o ID de pacote / nome de pacote exclusivo correspondente do app, mas você vai substituir essa configuração padrão.O BigQuery usa o valor
client_namespacepara o nome da tabela de lote em que cada app do Firebase vinculado grava.Encontre o gmp_app_id do app do Firebase para o qual você quer substituir as configurações padrão. Mude o valor client_namespace para o nome da tabela em que você quer que o app do Firebase grave dados. Geralmente, esse é o nome da tabela legada em que o app estava gravando dados com a infraestrutura de exportação legada.
Salve a mudança de configuração.
Programe um preenchimento para os dias em que a tabela atual não tem dados.
Depois que o preenchimento for concluído, exclua a nova tabela criada automaticamente pela nova infraestrutura de exportação.