Se seu aplicativo Android contiver bibliotecas nativas , você poderá habilitar rastreamentos de pilha completos e relatórios de falhas detalhados para seu código nativo do Firebase Crashlytics com algumas pequenas atualizações na configuração de compilação do seu aplicativo.
Este guia descreve como configurar relatórios de falhas com o Firebase Crashlytics SDK para NDK.
Se você está procurando como começar a usar o Crashlytics em seus projetos do Unity, confira o guia de primeiros passos do Unity.
Antes de você começar
Se ainda não o fez, adicione o Firebase ao seu projeto Android. Se você não tiver um aplicativo Android, poderá fazer o download de um aplicativo de amostra .
Recomendado : para obter recursos como usuários sem falhas, registros de navegação e alertas de velocidade, você precisa ativar o Google Analytics em seu projeto Firebase.
Se o seu projeto Firebase existente não tiver o Google Analytics ativado, você pode ativar o Google Analytics na guia Integrações de suas > Configurações do projeto no console do Firebase.
Se você estiver criando um novo projeto do Firebase, ative o Google Analytics durante o fluxo de trabalho de criação do projeto.
Etapa 1 : adicionar o SDK do Crashlytics para NDK ao seu aplicativo
No arquivo Gradle do módulo (nível do aplicativo) (geralmente<project>/<app-module>/build.gradle
), adicione a dependência para a biblioteca Crashlytics NDK Android. Recomendamos usar o Firebase Android BoM para controlar o controle de versão da biblioteca.Para uma experiência ideal com o Crashlytics, recomendamos habilitar o Google Analytics em seu projeto do Firebase e adicionar o SDK do Firebase para Google Analytics ao seu aplicativo.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.0') // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk' implementation 'com.google.firebase:firebase-analytics-ktx' }
Ao usar o Firebase Android BoM , seu aplicativo sempre usará versões compatíveis das bibliotecas do Firebase Android.
(Alternativa) Adicionar dependências da biblioteca Firebase sem usar o BoM
Se você optar por não usar o Firebase BoM, deverá especificar cada versão da biblioteca Firebase em sua linha de dependência.
Observe que, se você usar várias bibliotecas do Firebase em seu aplicativo, recomendamos usar o BoM para gerenciar as versões da biblioteca, o que garante que todas as versões sejam compatíveis.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk:18.3.3' implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.0') // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk' implementation 'com.google.firebase:firebase-analytics' }
Ao usar o Firebase Android BoM , seu aplicativo sempre usará versões compatíveis das bibliotecas do Firebase Android.
(Alternativa) Adicionar dependências da biblioteca Firebase sem usar o BoM
Se você optar por não usar o Firebase BoM, deverá especificar cada versão da biblioteca Firebase em sua linha de dependência.
Observe que, se você usar várias bibliotecas do Firebase em seu aplicativo, recomendamos usar o BoM para gerenciar as versões da biblioteca, o que garante que todas as versões sejam compatíveis.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk:18.3.3' implementation 'com.google.firebase:firebase-analytics:21.2.0' }
Etapa 2 : adicione o plug-in Crashlytics Gradle ao seu aplicativo
No arquivo Gradle de nível raiz (nível de projeto) (
<project>/build.gradle
), adicione o plug-in Crashlytics Gradle como uma dependência buildscript:buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' } }
No arquivo Gradle do módulo (nível do aplicativo) (geralmente
<project>/<app-module>/build.gradle
), adicione o plug-in Crashlytics Gradle:plugins { id 'com.android.application' // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' ... }
Etapa 3 : adicione a extensão firebaseCrashlytics
ao seu build
No arquivo Gradle do módulo (nível do aplicativo) (geralmente app/build.gradle
), adicione a extensão firebaseCrashlytics
.
Kotlin+KTX
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Java
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Etapa 4 : configurar o upload automático de símbolos nativos
Para produzir rastreamentos de pilha legíveis de falhas do NDK, o Crashlytics precisa conhecer os símbolos em seus binários nativos. O plug-in Crashlytics Gradle inclui a tarefa uploadCrashlyticsSymbolFile BUILD_VARIANT
para automatizar esse processo.
Para que você possa acessar a tarefa de upload de símbolo automatizado, certifique-se de que
nativeSymbolUploadEnabled
esteja definido comotrue
no arquivo Gradle do módulo (nível do aplicativo).Para que os nomes de método apareçam em seus rastreamentos de pilha, você deve invocar explicitamente a tarefa
uploadCrashlyticsSymbolFile BUILD_VARIANT
após cada compilação de sua biblioteca do NDK. Por exemplo:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Tanto o Crashlytics SDK for NDK quanto o plug-in Crashlytics Gradle dependem da presença do ID de compilação GNU nos objetos nativos compartilhados.
Você pode verificar a presença desse ID executando
readelf -n
em cada binário. Se o ID de compilação estiver ausente, adicione-Wl,--build-id
aos sinalizadores do sistema de compilação para corrigir o problema.
Etapa 5 : forçar uma falha de teste para concluir a configuração
Para concluir a configuração do Crashlytics e ver os dados iniciais no painel do Crashlytics do console do Firebase, você precisa forçar uma falha de teste.
Adicione um código ao seu aplicativo que você pode usar para forçar uma falha de teste.
Você pode usar o código a seguir na
MainActivity
do seu aplicativo para adicionar um botão ao seu aplicativo que, quando pressionado, causa uma falha. O botão é rotulado como "Test Crash".Kotlin+KTX
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Crie e execute seu aplicativo.
Force a falha de teste para enviar o primeiro relatório de falha do seu aplicativo:
Abra seu aplicativo no dispositivo ou emulador de teste.
Em seu aplicativo, pressione o botão "Test Crash" que você adicionou usando o código acima.
Depois que seu aplicativo falhar, reinicie-o para que ele possa enviar o relatório de falha ao Firebase.
Acesse o painel do Crashlytics do console do Firebase para ver a falha do seu teste.
Se você atualizou o console e ainda não está vendo a falha de teste após cinco minutos, habilite o log de depuração para ver se seu aplicativo está enviando relatórios de falha.
E é isso! O Crashlytics agora está monitorando seu aplicativo em busca de falhas, e você pode visualizar e investigar relatórios e estatísticas de falhas no painel do Crashlytics.
Opções alternativas para carregar símbolos
O fluxo de trabalho principal nesta página acima é aplicável para compilações Gradle padrão. No entanto, alguns aplicativos usam uma configuração ou ferramenta diferente (por exemplo, um processo de compilação diferente do Gradle). Nessas situações, as opções a seguir podem ser úteis para carregar símbolos com sucesso.
Opção : Carregar símbolos para módulos de biblioteca e dependências externas
Esta opção pode ser útil nas seguintes situações:
- Se você usar um processo de compilação personalizado do NDK no Gradle
- Se suas bibliotecas nativas forem construídas em um módulo de biblioteca/recurso ou fornecidas por terceiros
- Se a tarefa de carregamento automático de símbolos estiver falhando ou você estiver vendo falhas não simbolizadas no painel
A tarefa padrão de upload de símbolo do Crashlytics pressupõe que você esteja criando suas bibliotecas nativas como parte da compilação Gradle do módulo do aplicativo, usando ferramentas de compilação padrão do NDK, como CMake.
No entanto, se você estiver usando um processo de compilação personalizado do NDK no Gradle, ou se suas bibliotecas nativas forem criadas em um módulo de biblioteca/recurso ou fornecidas por terceiros, talvez seja necessário especificar explicitamente o caminho para suas bibliotecas não codificadas. Para fazer isso, você pode adicionar a propriedade unstrippedNativeLibsDir
dentro da extensão firebaseCrashlytics
em seu arquivo build.gradle
.
Certifique-se de ter concluído as seguintes tarefas iniciais do fluxo de trabalho principal anteriormente nesta página:
Para que a tarefa de upload automático de símbolos possa encontrar as informações do símbolo, adicione o seguinte ao arquivo
build.gradle
do módulo (nível do aplicativo):// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
O plug-in do Crashlytics pesquisará recursivamente o diretório especificado em busca de bibliotecas nativas com uma extensão
.so
. O Crashlytics extrai os símbolos de depuração de todas essas bibliotecas e os carrega nos servidores Firebase.Aqui está o que você pode especificar na propriedade
unstrippedNativeLibsDir
:Qualquer argumento permitido para
org.gradle.api.Project#files(Object...)
, incluindo:java.lang.String
,java.io.File
ouorg.gradle.api.file.FileCollection
Vários diretórios para um único tipo de compilação, fornecendo uma lista ou instância de
FileCollection
Por fim, force uma falha de teste para concluir a configuração do Crashlytics e ver os dados iniciais no painel do Crashlytics do console do Firebase.
Opção : Carregar símbolos para compilações não Gradle ou bibliotecas nativas não acessíveis inacessíveis
Esta opção pode ser útil nas seguintes situações:
Se você usar um processo de compilação diferente do Gradle
Se suas bibliotecas nativas não removidas forem fornecidas a você de alguma forma que não estejam acessíveis durante as compilações do Gradle
Essa opção exige que você execute um comando Firebase CLI ao criar um build de lançamento ou qualquer build para o qual deseja ver rastreamentos de pilha simbolizados no console do Firebase.
Certifique-se de ter concluído as seguintes tarefas iniciais do fluxo de trabalho principal anteriormente nesta página:
Adicionado o Crashlytics SDK para NDK e o plug- in Crashlytics Gradle .
Observe que, com essa opção, você não precisa adicionar a extensão
firebaseCrashlytics
ou configurar o upload automático de símbolos porque, em vez disso, usará a Firebase CLI (próximas etapas abaixo) para gerar e fazer upload de seus arquivos de símbolo.Configure seu ambiente e projeto para upload de símbolos:
Siga as instruções para instalar o Firebase CLI .
Se você já instalou a CLI, atualize para a versão mais recente .
(somente para aplicativos que usam Android API de nível 30 ou superior) Atualize o modelo
AndroidManifest.xml
do seu aplicativo para desativar a marcação de ponteiro:Marque a caixa Android Player Settings > Publishing Settings > Build > Custom Main Manifest .
Abra o modelo de manifesto localizado em
Assets/Plugins/Android/AndroidManifest.xml
.Adicione o seguinte atributo à tag do aplicativo:
<application android:allowNativeHeapPointerTagging="false" ... />
Construa seu projeto.
Carregue suas informações de símbolos.
Após a conclusão da compilação, gere um arquivo de símbolo compatível com o Crashlytics e faça o upload dele para os servidores Firebase executando o seguinte comando Firebase CLI:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : seu ID do aplicativo Firebase para Android (não o nome do seu pacote)
Exemplo de ID do aplicativo Firebase para Android:1:567383003300:android:17104a2ced0c9b9b
Aqui estão duas maneiras de encontrar seu ID do aplicativo Firebase:
No arquivo
google-services.json
, o ID do aplicativo é o valormobilesdk_app_id
; ouNo console do Firebase, acesse as configurações do projeto . Role para baixo até o cartão Seus aplicativos e clique no aplicativo Firebase desejado para encontrar o ID do aplicativo.
PATH/TO/SYMBOLS : O caminho para o arquivo de símbolo gerado pela CLI
Exportado para um projeto do Android Studio — PATH/TO/SYMBOLS pode ser qualquer diretório. A Firebase CLI pesquisará recursivamente o diretório especificado em busca de bibliotecas nativas com uma extensão
.so
.Construa o APK diretamente de dentro do Unity — PATH/TO/SYMBOLS é o caminho do arquivo de símbolo compactado gerado no diretório raiz do projeto quando sua compilação for concluída (por exemplo:
myproject/myapp-1.0-v100.symbols.zip
).
Veja opções avançadas para usar o comando Firebase CLI para geração e upload de arquivos de símbolo
Bandeira Descrição --generator=csym
Usa o gerador de arquivo de símbolo cSYM herdado em vez do gerador Breakpad padrão
Não recomendado para uso. Recomendamos usar o gerador de arquivo de símbolo padrão do Breakpad.
--generator=breakpad
Usa o gerador de arquivo de símbolo Breakpad
Observe que o padrão para geração de arquivo de símbolo é Breakpad. Use esse sinalizador apenas se tiver adicionado
symbolGenerator { csym() }
em sua configuração de compilação e quiser substituí-lo para usar o Breakpad.--dry-run
Gera os arquivos de símbolos, mas não os carrega
Este sinalizador é útil se você deseja inspecionar o conteúdo dos arquivos enviados.
--debug
Fornece informações adicionais de depuração Por fim, force uma falha de teste para concluir a configuração do Crashlytics e ver os dados iniciais no painel do Crashlytics do console do Firebase.
Depois de criar seu aplicativo para forçar uma falha, certifique-se de executar o comando
crashlytics:symbols:upload
da Firebase CLI para fazer upload do arquivo de símbolo.
Solução de problemas
Se você estiver vendo diferentes rastreamentos de pilha no console do Firebase e no logcat, consulte o guia de solução de problemas .
Próximos passos
Personalize a configuração do relatório de travamento adicionando relatórios opcionais, logs, chaves e rastreamento de erros não fatais.
Integre-se com o Google Play para que você possa filtrar os relatórios de falhas do seu aplicativo Android pela trilha do Google Play diretamente no painel do Crashlytics. Isso permite que você concentre melhor seu painel em compilações específicas.