Geração de IDs de resposta de anúncio com o Firebase Crashlytics

O Firebase Crashlytics é uma ferramenta de relatório de falhas leve e em tempo real que facilita o gerenciamento de problemas de estabilidade no seu app. O Crashlytics economiza tempo na solução de problemas agrupando de forma inteligente as falhas e destacando as circunstâncias que levam a elas.

Este guia descreve como integrar o Crashlytics ao seu projeto do Android Studio para que você possa registrar IDs de resposta de anúncios. Depois, ao resolver problemas de falhas no app, você pode procurar o ID de resposta do anúncio e usar a Central de revisão de anúncios na Ad Manager para encontrar e bloquear os anúncios.

Etapa 1:adicionar o Firebase a um aplicativo Android

  1. Se você quiser tentar fazer login com o Firebase em um app limpo, faça o download ou clone os exemplos do SDK dos anúncios para dispositivos móveis do Google para o repositório do Android no GitHub. Este guia usa especificamente o Exemplo de banner.

    Se você já tiver um app, poderá prosseguir para outras etapas com o nome do pacote dele. As mesmas etapas também podem ser aplicadas a outros exemplos no repositório com pequenas adaptações.

  2. Para usar o Firebase Crashlytics, você precisa criar um projeto do Firebase e adicionar seu app a ele. Crie um projeto do Firebase, se ainda não tiver um. Registre seu app nele.

    1. Na página do Crashlytics no console do Firebase, clique em Configurar Crashlytics.

    2. Na tela que aparece, clique em Não > Configurar um novo app do Firebase.

  3. No build.gradle, adicione as dependências do Google Analytics, do Fabric e do Crashlytics.

    app/build.gradle

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    // Add the Fabric plugin
    apply plugin: 'io.fabric'
    
    dependencies {
        // ...
    
        // Add the Google Mobile Ads SDK
        implementation 'com.google.android.gms:play-services-ads:23.5.0'
    
        // Add the Firebase Crashlytics dependency.
        implementation 'com.google.firebase:firebase-crashlytics:19.2.1'
    }

    project/build.gradle

    buildscript {
        repositories {
            // ...
            // Add Google's Maven repository.
            google()
        }
    
        dependencies {
            // ...
    
            classpath 'com.google.gms:google-services:4.4.2'
    
            // Add the Fabric Crashlytics plugin.
            classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2'
        }
    }
    
    allprojects {
        // ...
        repositories {
           // Check that Google's Maven repository is included (if not, add it).
           google()
    
           // ...
        }
    }
  4. Crie e execute o app para garantir que o Crashlytics esteja configurado corretamente. Depois de concluir, você poderá acessar o painel do Crashlytics.

(Opcional): testar a configuração

Com a adição de um botão de falha, é possível forçar a ocorrência de uma falha no app a cada pressionamento de botão.

Confira um exemplo que mostra como adicionar um botão de falha no método onCreate() de um Activity:

MainActivity (excerto)

Java

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_my);

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view);

  // Start loading the ad in the background.
  adView.loadAd(new AdManagerAdRequest.Builder().build());

  // Add a crash button.
  Button crashButton = new Button(this);
  crashButton.setText("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

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_my)

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view)

  // Start loading the ad in the background.
  adView.loadAd(AdManagerAdRequest.Builder().build())

  // Add a crash button.
  val crashButton = Button(this)
  crashButton.text = "Crash!"
  crashButton.setOnClickListener {
    throw RuntimeException("Test Crash") // Force a crash
  }

  addContentView(crashButton, ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT))
}

No Android Studio, crie e execute o app em um emulador ou dispositivo conectado. Depois que o app for carregado, clique no botão Crash. Reinicie o app no dispositivo ou no Android Studio para que o registro de falhas seja enviado ao Crashlyics.

Etapa 2:registrar o ID da resposta do anúncio

Se você carregar vários anúncios e os mostrar em momentos diferentes, é recomendável registrar cada ID de resposta do anúncio com uma chave separada. Por exemplo, este guia usa um exemplo com apenas um anúncio de banner. Portanto, registramos o ID da resposta do anúncio como a chave banner_ad_response_id no snippet a seguir. É possível criar vários pares de chave-valor personalizados no Firebase Crashlytics para diferentes tipos e eventos de anúncios. Consulte AdListener para conferir o ciclo de vida do anúncio. Acesse Personalizar relatórios de erros do Firebase Crashlytics para mais informações sobre o registro personalizado.

Adicione o seguinte código ao MyActivity.java: Essencialmente, ele usa a função FirebaseCrashlytics.setCustomKey() na função de callback onAdLoaded() para garantir que o anúncio tenha sido carregado antes de tentar chamar getResponseInfo().

Java

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_my);

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view);

  adView.setAdListener(new AdListener() {
    @Override
    public void onAdLoaded() {
      String adResponseId = adView.getResponseInfo().getResponseId();
      FirebaseCrashlytics.getInstance().setCustomKey(
          "banner_ad_response_id", adResponseId);
    }
  });

  // Start loading the ad in the background.
  adView.loadAd(new AdManagerAdRequest.Builder().build());

  // Add a crash button.
  Button crashButton = new Button(this);
  crashButton.setText("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

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_my)

  // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
  // values/strings.xml.
  adView = findViewById(R.id.ad_view)

  adView.adListener = object : AdListener() {
    override fun onAdLoaded() {
      mAdView.responseInfo?.responseId?.let { adResponseId ->
          FirebaseCrashlytics.getInstance().setCustomKey(
              "banner_ad_response_id", adResponseId)
      }
    }
  }

  // Start loading the ad in the background.
  adView.loadAd(AdManagerAdRequest.Builder().build())

  // Add a crash button.
  val crashButton = Button(this)
  crashButton.text = "Crash!"
  crashButton.setOnClickListener {
    throw RuntimeException("Test Crash") // Force a crash
  }

  addContentView(crashButton, ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT))
}

Parabéns! Agora você vai encontrar o banner_ad_response_id mais recente na seção principal das sessões de falha no painel do Crashlytics. Algumas chaves podem levar até uma hora para aparecer no painel.