Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Obtenha relatórios de falhas do Android NDK

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Se seu aplicativo Android contiver bibliotecas nativas , você poderá ativar 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 SDK do Firebase Crashlytics para NDK.

Se você estiver procurando como começar a usar o Crashlytics em seus projetos do Unity, confira o guia de conceitos básicos do Unity .

Antes de você começar

  1. Se ainda não o fez, adicione o Firebase ao seu projeto Android. Se você não tiver um aplicativo para Android, faça o download de um aplicativo de amostra .

  2. Recomendado : para obter recursos como usuários sem falhas, logs de navegação e alertas de velocidade, você precisa ativar o Google Analytics em seu projeto do Firebase.

    • Se seu projeto existente do Firebase não tiver o Google Analytics ativado, você poderá 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 Android do Crashlytics NDK. Recomendamos usar o Firebase Android BoM para controlar o controle de versão da biblioteca.

Para uma experiência ideal com o Crashlytics, recomendamos ativar o Google Analytics em seu projeto do Firebase e adicionar o SDK do Firebase para Google Analytics ao seu aplicativo.

Java

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:31.1.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 do Firebase sem usar o BoM

Se você optar por não usar o Firebase BoM, deverá especificar cada versão da biblioteca do Firebase em sua linha de dependência.

Observe que, se você usa várias bibliotecas do Firebase em seu aplicativo, é altamente recomendável 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.2'
    implementation 'com.google.firebase:firebase-analytics:21.2.0'
}

Kotlin+KTX

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:31.1.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 do Firebase sem usar o BoM

Se você optar por não usar o Firebase BoM, deverá especificar cada versão da biblioteca do Firebase em sua linha de dependência.

Observe que, se você usa várias bibliotecas do Firebase em seu aplicativo, é altamente recomendável 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.2'
    implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0'
}

Etapa 2 : adicione o plug-in Crashlytics Gradle ao seu aplicativo

  1. Em seu arquivo Gradle de nível raiz (nível de projeto) ( <project>/build.gradle ), adicione o plug-in Crashlytics Gradle como uma dependência de 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.14'
    
            // Add the dependency for the Crashlytics Gradle plugin
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
        }
    }
  2. No arquivo Gradle do módulo (nível do aplicativo) (geralmente <project>/<app-module>/build.gradle ), adicione o plug-in Gradle do Crashlytics:

    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 : adicionar a extensão firebaseCrashlytics à sua compilação

No arquivo Gradle do módulo (nível do aplicativo) (geralmente app/build.gradle ), adicione a extensão firebaseCrashlytics .

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
          }
      }
  }
}

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
          }
      }
  }
}

Etapa 4 : configurar o upload automático de símbolos nativos

Para produzir rastreamentos de pilha legíveis de travamentos 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.

  1. Para que você possa acessar a tarefa de upload automatizado de símbolos, certifique-se de que nativeSymbolUploadEnabled esteja definido como true em seu arquivo Gradle de módulo (nível de aplicativo).

  2. Para que os nomes de métodos 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
    
  3. Tanto o Crashlytics SDK para NDK quanto o plug-in Crashlytics Gradle dependem da presença do ID de compilação GNU nos objetos compartilhados nativos.

    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 seu 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.

  1. Adicione código ao seu aplicativo que você pode usar para forçar uma falha de teste.

    Você pode usar o seguinte código 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".

    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));
    

    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))
    
  2. Crie e execute seu aplicativo.

  3. Force a falha de teste para enviar o primeiro relatório de falha do seu aplicativo:

    1. Abra seu aplicativo em seu dispositivo de teste ou emulador.

    2. Em seu aplicativo, pressione o botão "Test Crash" que você adicionou usando o código acima.

    3. Depois que o app travar, reinicie-o para que o app possa enviar o relatório de falhas ao Firebase.

  4. Acesse o painel do Crashlytics do console do Firebase para ver a falha do 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 padrão do Gradle. 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 êxito.

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ê usa um processo de compilação do NDK personalizado no Gradle
  • Se suas bibliotecas nativas forem criadas 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 simbólicas no painel

Opção : Carregar símbolos para compilações não Gradle ou bibliotecas nativas não removidas 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 sejam acessíveis durante as compilações do Gradle



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