Skip to content

Módulo VI - Firebase

Visão geral

O Firebase é uma plataforma de serviços gerenciados que apoia o desenvolvimento de aplicativos com recursos como autenticação, banco de dados, armazenamento de arquivos, notificações, analytics e monitoramento de falhas. Em Android, a integração ocorre por meio do Firebase SDK, que conecta o aplicativo a um projeto configurado no console.

A integração típica segue a sequência: criar o projeto no console → registrar o aplicativo Android → incluir o arquivo de configuração → adicionar dependências → validar a comunicação com um serviço inicial (por exemplo, Analytics ou Crashlytics) 1.

flowchart LR APP[Aplicativo Android] --> SDK[Firebase SDK] SDK --> AUTH[Authentication] SDK --> DB[Firestore / Realtime Database] SDK --> ST[Storage] SDK --> MSG[Cloud Messaging] SDK --> CR[Crashlytics] SDK --> AN[Analytics]

Modelo mental: cliente, servidor e regras

Para entender “como integrar Firebase” de forma segura, é útil separar o que roda no cliente (o aplicativo Android) do que roda em um servidor (quando existe). O SDK do Firebase no Android é um SDK de cliente: ele executa requisições diretamente aos serviços do Firebase usando as credenciais e o contexto do app.

Isso não significa que o app “pode tudo”. O acesso a dados (Firestore e Storage) é controlado por Security Rules. Essas regras definem o que um usuário autenticado (ou anônimo) pode ler e escrever. Essa é a base da segurança no lado do Firebase para apps móveis.

Quando o projeto precisa de operações privilegiadas (por exemplo, tarefas administrativas, envio de notificações em massa, validações que não devem ficar no app), é comum existir uma camada de servidor usando o Firebase Admin SDK. O Admin SDK usa credenciais de serviço e não deve ser embutido no aplicativo.

flowchart TB subgraph Cliente A[App Android\nFirebase Client SDK] end subgraph Firebase F[(Firestore)] S[(Storage)] M[(FCM)] R[Security Rules] end subgraph Servidor\n(opcional) B[Backend\nFirebase Admin SDK] end A -->|leitura/escrita\nregulada por Rules| R R --> F R --> S B -->|operações privilegiadas| F B -->|operações privilegiadas| S B -->|envio de mensagens| M

Pré-requisitos

Para uma integração previsível, o projeto precisa atender a alguns requisitos práticos:

  • possuir um pacote Android definido (applicationId), pois ele identifica o app no Firebase;
  • usar uma versão do Gradle/Android Gradle Plugin compatível com as bibliotecas atuais;
  • ter acesso a uma conta Google para criar e administrar o projeto no console.

A documentação oficial é a referência primária para requisitos e passos atualizados, pois eles podem mudar ao longo do tempo 1.

Passo 1 — Criar um projeto no Firebase Console

No Firebase Console, a equipe cria um novo projeto. Em seguida, registra-se o aplicativo Android informando o package name (applicationId). Em muitos casos também se informa o SHA-1 (e, às vezes, SHA-256) para habilitar recursos como logins com provedores e APIs específicas.

O resultado desse passo é o registro do app dentro do projeto Firebase.

Passo 2 — Baixar e adicionar o arquivo de configuração

Após registrar o app, o console fornece o arquivo google-services.json. Esse arquivo deve ser colocado no módulo do aplicativo (normalmente app/ no projeto Android).

Esse arquivo contém identificadores e chaves públicas do projeto e permite que o plugin de build gere recursos e metadados necessários para o SDK localizar o projeto correto.

Passo 3 — Adicionar dependências do Firebase (BoM)

Em projetos modernos, recomenda-se usar o Firebase BoM (Bill of Materials) para manter versões coerentes entre bibliotecas 2. Com o BoM, a equipe define uma versão única e adiciona as dependências de serviços específicos sem declarar versões individuais.

Nesta etapa, o projeto normalmente também habilita o plugin do Google Services, que processa o google-services.json 1.

Passo 3.1 — Organização por ambientes (dev/homolog/prod)

Em projetos de ensino e projetos reais, o time normalmente precisa separar ao menos dois ambientes: um para desenvolvimento e outro para produção. Uma prática comum é usar projetos Firebase distintos (por exemplo, “app-dev” e “app-prod”), cada um com seu próprio google-services.json.

O objetivo é reduzir risco: testes e dados de sala/laboratório não devem afetar o ambiente de produção. Essa separação também facilita mudar configurações (como regras e provedores de login) sem impactar usuários reais.

Passo 4 — Inicialização do Firebase no app

Em geral, a inicialização do Firebase é automática quando o projeto inclui o arquivo de configuração e as dependências. Ao iniciar o app, o SDK lê as configurações e prepara os serviços.

Para verificar a integração, é comum começar por um serviço simples:

  • Analytics: verificar eventos no console;
  • Crashlytics: forçar um crash controlado (em ambiente de teste) e confirmar o relatório no console.

Passo 4.1 — Diagnóstico de problemas comuns (integração inicial)

Quando o Firebase “não funciona” logo após o setup, os problemas mais comuns tendem a ser de configuração e identificação do app.

O time costuma validar, em ordem:

  • o applicationId do módulo Android é exatamente o mesmo registrado no Firebase Console;
  • o arquivo google-services.json foi adicionado no módulo correto (o módulo do app);
  • o build está resolvendo as dependências do BoM e sincronizando sem conflitos de versão 2;
  • o dispositivo/emulador tem conectividade e data/hora corretas (certificados e TLS podem falhar quando o relógio está muito errado).

Passo 5 — Integrar serviços comuns (visão prática)

A integração “completa” com Firebase costuma ser incremental: a equipe habilita apenas o que o app precisa, um serviço por vez, testando o comportamento no emulador e em dispositivos reais.

Autenticação (Firebase Authentication)

O Firebase Authentication oferece autenticação por e-mail/senha e por provedores (Google, Apple, etc.). O fluxo geral é:

  1. habilitar o provedor no console;
  2. implementar o fluxo de login no app;
  3. ler o usuário autenticado e proteger rotas/telas.

A documentação oficial apresenta os passos e decisões de integração por provedor 3.

Uma distinção importante para a arquitetura do app é: o cliente autentica o usuário e obtém um ID token. Em cenários com backend próprio, esse token é enviado ao servidor, que valida a identidade do usuário (normalmente com Admin SDK) antes de executar ações privilegiadas.

Banco de dados (Cloud Firestore)

O Firestore é um banco NoSQL orientado a documentos, muito usado para dados sincronizados e consultas simples a moderadas. A integração típica envolve:

  • definir coleções e documentos;
  • criar regras de segurança (Security Rules);
  • ler/gravar dados a partir do app;
  • testar regras e consultas.

A documentação do Firestore descreve modelagem e regras de segurança para Android 4.

Ao modelar dados, uma regra prática é preferir documentos “pequenos e coesos”, evitando coleções com documentos gigantes. O custo de leitura no Firestore é por documento lido; portanto, uma modelagem que reduz leituras desnecessárias tende a ser mais eficiente.

Armazenamento de arquivos (Cloud Storage)

O Cloud Storage é usado para arquivos (imagens, PDFs, áudios). Um roteiro comum é:

  • definir “pastas” lógicas (caminhos) para organização;
  • enviar arquivos com metadados quando necessário;
  • recuperar URLs para exibição;
  • configurar regras de acesso (por exemplo, apenas usuário autenticado).

A referência oficial de início rápido do Storage (Android) detalha o fluxo de upload/download e as decisões típicas de configuração 5.

Notificações (Firebase Cloud Messaging)

O FCM permite enviar push notifications. Em alto nível, a integração exige:

  • registrar o dispositivo e obter um token;
  • enviar mensagens a partir de um servidor (ou do console, para testes);
  • tratar mensagens em primeiro e segundo plano.

Como mensagens impactam UX e permissões, a equipe costuma validar cuidadosamente o comportamento por versão do Android.

No FCM, existem duas “pontas”: o cliente (app) recebe um token e processa mensagens, e um servidor (ou ferramenta de envio) envia mensagens para tokens ou tópicos. A documentação de FCM em Android descreve os requisitos e o comportamento do cliente 6.

Crashlytics (observabilidade)

Crashlytics coleta e organiza falhas (crashes) e alguns tipos de erros não fatais (non-fatal) quando configurado. Ele ajuda a priorizar correções com base em frequência e impacto. A documentação do Crashlytics descreve integração, testes e publicação 7.

Passo 5.1 — Analytics (instrumentação mínima)

Em muitos cursos e projetos, Analytics é adotado primeiro por ser uma validação rápida do setup: eventos aparecem no console sem exigir modelagem de dados. A documentação de Analytics em Android descreve a instrumentação inicial e as formas de enviar eventos 8.

Passo 6 — Segurança: regras, chaves e ambientes

Integração com Firebase sempre envolve decisões de segurança. Três recomendações de base são:

  1. Regras de segurança: Firestore/Storage devem ter regras que reflitam a política do app; nunca confiar apenas na validação do cliente.
  2. Separação de ambientes: é comum manter projetos distintos para desenvolvimento e produção, reduzindo risco de testes afetarem dados reais.
  3. Princípio do menor privilégio: permissões e acessos devem ser mínimos para a necessidade do app.

As referências de Security Rules ajudam a compreender como escrever regras e testá-las para Firestore e Storage 91011.

Sobre chaves e credenciais

O aplicativo Android não deve conter credenciais do Admin SDK (service account). Chaves privadas devem ficar apenas em ambientes controlados (servidores, CI/CD ou máquinas de desenvolvimento com proteção adequada). No app, a segurança depende principalmente de autenticação e Security Rules.

Passo 6.1 — Emuladores para desenvolvimento (quando disponível)

Quando a turma ou o time deseja desenvolver sem depender de ambiente remoto o tempo todo, é possível usar o Firebase Emulator Suite, que simula serviços localmente. Isso tende a reduzir atrito em sala (rede instável, limites de cota, criação de dados de teste). A documentação oficial descreve como habilitar e usar os emuladores 12.

Exemplos de código (Kotlin)

Os exemplos a seguir usam Kotlin e estão divididos em dois contextos:

  • Android (Client SDK): o app integra autenticação, Firestore/Storage e recebe mensagens via FCM.
  • Servidor (Kotlin/JVM com Admin SDK): um backend valida tokens, acessa dados com privilégios e envia notificações.

Em um projeto real, o Admin SDK deve rodar no servidor, não no aplicativo Android 13.

Dependências (exemplo em Gradle Kotlin DSL)

O uso do BoM reduz conflitos de versão entre bibliotecas 2.

// build.gradle.kts (módulo :app)
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:<versao>"))

    implementation("com.google.firebase:firebase-auth-ktx")
    implementation("com.google.firebase:firebase-firestore-ktx")
    implementation("com.google.firebase:firebase-storage-ktx")
    implementation("com.google.firebase:firebase-messaging-ktx")
    implementation("com.google.firebase:firebase-crashlytics-ktx")
    implementation("com.google.firebase:firebase-analytics-ktx")
}

Authentication: obter o ID token do usuário

Esse token pode ser enviado ao backend para validação (via Admin SDK) quando o projeto usa um servidor próprio.

import com.google.firebase.auth.FirebaseAuth
import kotlinx.coroutines.tasks.await

suspend fun obterIdToken(): String? {
    val user = FirebaseAuth.getInstance().currentUser ?: return null
    val result = user.getIdToken(false).await()
    return result.token
}

Firestore: gravar e ler documentos

import com.google.firebase.firestore.FirebaseFirestore
import kotlinx.coroutines.tasks.await

data class Usuario(
    val nome: String = "",
    val ativo: Boolean = true,
)

suspend fun criarUsuario(uid: String, nome: String) {
    val db = FirebaseFirestore.getInstance()
    db.collection("usuarios").document(uid)
        .set(Usuario(nome = nome, ativo = true))
        .await()
}

suspend fun listarUsuariosAtivos(limit: Long = 20): List<Pair<String, Usuario>> {
    val db = FirebaseFirestore.getInstance()
    val snapshot = db.collection("usuarios")
        .whereEqualTo("ativo", true)
        .limit(limit)
        .get()
        .await()

    return snapshot.documents.mapNotNull { doc ->
        val usuario = doc.toObject(Usuario::class.java)
        if (usuario != null) doc.id to usuario else null
    }
}

Storage: upload de arquivo (por URI)

import android.net.Uri
import com.google.firebase.storage.FirebaseStorage
import kotlinx.coroutines.tasks.await

suspend fun uploadAvatar(uid: String, uri: Uri): String {
    val storage = FirebaseStorage.getInstance()
    val ref = storage.reference.child("avatars/$uid.jpg")

    ref.putFile(uri).await()
    return ref.path
}

FCM: obter token do dispositivo e receber mensagens

Obter o token (para associar ao usuário no Firestore e permitir envios direcionados):

import com.google.firebase.messaging.FirebaseMessaging
import kotlinx.coroutines.tasks.await

suspend fun obterTokenFcm(): String {
    return FirebaseMessaging.getInstance().token.await()
}

Receber mensagens (exemplo minimalista):

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class AppMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(message: RemoteMessage) {
        // Processar payload e gerar notificação local (se necessário)
    }

    override fun onNewToken(token: String) {
        // Enviar token atualizado para o backend ou salvar no Firestore
    }
}

Crashlytics e Analytics: instrumentação mínima

import android.os.Bundle
import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.crashlytics.FirebaseCrashlytics

fun registrarEventoAnalytcs(analytics: FirebaseAnalytics) {
    analytics.logEvent("abrir_tela", Bundle().apply {
        putString("nome", "home")
    })
}

fun registrarErro(crashlytics: FirebaseCrashlytics, err: Throwable) {
    crashlytics.recordException(err)
}

Admin SDK é para servidor

Esses exemplos são para um backend em Kotlin/JVM. Eles não devem ser executados no Android.

Inicialização do Admin SDK

O backend lê credenciais de service account em ambiente controlado (por exemplo, variável de ambiente apontando para um JSON protegido) 13.

import com.google.auth.oauth2.GoogleCredentials
import com.google.firebase.FirebaseApp
import com.google.firebase.FirebaseOptions
import java.io.FileInputStream

fun initAdmin() {
    if (FirebaseApp.getApps().isNotEmpty()) return

    val credPath = System.getenv("GOOGLE_APPLICATION_CREDENTIALS")
        ?: error("Definir GOOGLE_APPLICATION_CREDENTIALS")

    FileInputStream(credPath).use { stream ->
        val options = FirebaseOptions.builder()
            .setCredentials(GoogleCredentials.fromStream(stream))
            .build()

        FirebaseApp.initializeApp(options)
    }
}

Validação de identidade: verificar um ID token

import com.google.firebase.auth.FirebaseAuth

data class UsuarioAutenticado(
    val uid: String,
    val email: String?,
    val provider: String?,
)

fun verificarToken(idToken: String): UsuarioAutenticado {
    val decoded = FirebaseAuth.getInstance().verifyIdToken(idToken)
    return UsuarioAutenticado(
        uid = decoded.uid,
        email = decoded.email,
        provider = decoded.claims["firebase"]
            ?.let { it as? Map<*, *> }
            ?.get("sign_in_provider")
            ?.toString(),
    )
}

Firestore: gravar e ler documentos (admin)

import com.google.cloud.firestore.Firestore
import com.google.firebase.cloud.FirestoreClient

data class Usuario(val nome: String, val ativo: Boolean)

fun criarUsuario(uid: String, nome: String) {
    val db: Firestore = FirestoreClient.getFirestore()
    db.collection("usuarios").document(uid).set(Usuario(nome, true))
}

FCM: envio de notificação para um token

import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.Message
import com.google.firebase.messaging.Notification

fun enviarPush(token: String, titulo: String, corpo: String): String {
    val message = Message.builder()
        .setToken(token)
        .setNotification(Notification.builder().setTitle(titulo).setBody(corpo).build())
        .build()

    return FirebaseMessaging.getInstance().send(message)
}

Passo 7 — Validação e checklist

Ao finalizar a primeira integração, espera-se que o projeto consiga confirmar:

  • o app está registrado corretamente no console e o google-services.json corresponde ao applicationId;
  • o build inclui o BoM e as dependências necessárias 2;
  • ao menos um serviço foi validado ponta a ponta (por exemplo, um evento no Analytics ou um crash no Crashlytics);
  • regras de Firestore/Storage estão configuradas (quando esses serviços são usados);
  • o app trata erros de rede e estados offline de forma previsível.

Referências

  • Firebase Documentation: Add Firebase to your Android project 1
  • Firebase Documentation: Firebase BoM (Android) 2
  • Firebase Documentation: Firebase Authentication on Android 3
  • Firebase Documentation: Cloud Firestore on Android 4
  • Firebase Documentation: Cloud Storage for Android 5
  • Firebase Documentation: Firebase Cloud Messaging on Android 6
  • Firebase Documentation: Google Analytics for Firebase (Android) 8
  • Firebase Documentation: Crashlytics on Android 7
  • Firebase Documentation: Security Rules 9
  • Firebase Documentation: Firebase Emulator Suite 12
  • Firebase Documentation: Admin SDK 13

  1. Firebase Documentation. Add firebase to your android project. 2026. URL: https://firebase.google.com/docs/android/setup

  2. Firebase Documentation. Use the firebase android bom. 2026. URL: https://firebase.google.com/docs/android/learn-more#bom

  3. Firebase Documentation. Get started with firebase authentication on android. 2026. URL: https://firebase.google.com/docs/auth/android/start

  4. Firebase Documentation. Get started with cloud firestore on android. 2026. URL: https://firebase.google.com/docs/firestore/quickstart

  5. Firebase Documentation. Get started with cloud storage on android. 2026. URL: https://firebase.google.com/docs/storage/android/start

  6. Firebase Documentation. Set up a firebase cloud messaging client app on android. 2026. URL: https://firebase.google.com/docs/cloud-messaging/android/client

  7. Firebase Documentation. Get started with firebase crashlytics. 2026. URL: https://firebase.google.com/docs/crashlytics/get-started

  8. Firebase Documentation. Get started with google analytics for firebase on android. 2026. URL: https://firebase.google.com/docs/analytics/get-started?platform=android

  9. Firebase Documentation. Firebase security rules. 2026. URL: https://firebase.google.com/docs/rules

  10. Firebase Documentation. Get started with cloud firestore security rules. 2026. URL: https://firebase.google.com/docs/firestore/security/get-started

  11. Firebase Documentation. Get started with cloud storage security rules. 2026. URL: https://firebase.google.com/docs/storage/security

  12. Firebase Documentation. Firebase local emulator suite. 2026. URL: https://firebase.google.com/docs/emulator-suite

  13. Firebase Documentation. Firebase admin sdk. 2026. URL: https://firebase.google.com/docs/admin/setup