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. Ele poupa tempo de solução de problemas agrupando de maneira 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 do anúncio. Mais tarde, ao resolver problemas no seu aplicativo, você poderá pesquisar o ID da 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 testar a geração de registros 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. Neste guia, usamos especificamente o Exemplo de banner do Exemplo de banner.

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

  2. Para usar o Firebase Crashlytics, crie um projeto do Firebase e adicione seu app a ele. Crie um projeto do Firebase, caso ainda não tenha feito isso. Registre seu app nele.

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

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

  3. No build.gradle, adicione as dependências do Google Analytics, Fabric e 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:22.4.0'
    
        // Add the Firebase Crashlytics dependency.
        implementation 'com.google.firebase:firebase-crashlytics:18.4.1'
    }
    

    projeto/build.gradle

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

(Opcional): Testar a configuração

Ao adicionar um botão de falha, é possível forçar a ocorrência de uma falha no app ao pressionar cada botão.

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

MainActivity (trecho)

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: registre o ID de resposta do anúncio

Se você carregar vários anúncios e exibi-los em momentos diferentes, é recomendável registrar cada código de resposta do anúncio com uma chave separada. Por exemplo, este guia usa um exemplo que tem apenas um anúncio de banner. Por isso, registramos o ID da resposta do anúncio como a chave banner_ad_response_id no snippet a seguir. Na verdade, é possível criar vários pares personalizados de chave-valor no Firebase Crashlytics para diferentes tipos e eventos de anúncio. Consulte AdListener para ver o ciclo de vida do anúncio. Acesse Personalizar relatórios de erros do Firebase Crashlytics para mais informações sobre a geração de registros personalizada.

Adicione o seguinte código ao seu MyActivity.java. Essencialmente, ele usa a função FirebaseCrashlytics.setCustomKey() na função de callback onAdLoaded() para garantir que o anúncio tenha 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ê verá 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 ficarem visíveis no painel.