LGPD no App: Como Coletar Telemetria sem Violar os Direitos do Usuário
Mapa de bases legais por tipo de telemetria, auditoria de SDKs e arquitetura de coleta compliant para App Store, Play Store e LGPD.
Contexto
No cold start, o app dispara Firebase Analytics, Crashlytics, Adjust ou Sentry — muitas vezes antes de qualquer tela de privacidade. Para o dev, é "só telemetria". Para a LGPD, cada hit pode ser dado pessoal.
Identificadores como IDFA (iOS), GAID (Android), IP, token de instalação e device ID não são "técnicos demais para contar". Se permitem reidentificar alguém ou montar perfil comportamental, entram no Art. 5º da LGPD.
Além da lei, as lojas impõem regras próprias: Apple exige App Tracking Transparency (ATT) e Privacy Manifests; Google exige a seção Data Safety na Play Store. Declarar uma coisa na loja e o SDK fazer outra no código é receita para rejeição do app — e notificação da ANPD.
O objetivo deste guia é operacional: classificar o que você coleta, escolher a base legal certa e desenhar uma arquitetura que dev e PM consigam implementar sem whitepaper jurídico.
Problema
Três erros aparecem em quase todo app que audito:
| Erro comum | Consequência |
|---|---|
| Tratar crash log, analytics e ads como o mesmo fluxo | Base legal errada; consentimento ausente onde é obrigatório |
| Confiar no SDK "out of the box" | Coleta silenciosa de ID/IP que você não declarou |
| Banner genérico ou dark pattern no consentimento | Consentimento inválido; opt-in pré-marcado reprovado pela ANPD |
O controlador do app responde pelo que o SDK envia — mesmo que você não tenha lido o payload. Integrar Firebase ou Adjust no Application.onCreate() sem gate de consentimento não transfere a responsabilidade para o vendor.
Há também uma distinção que jurídico e engenharia costumam confundir: logs de acesso (Marco Civil, Art. 15) não são a mesma coisa que telemetria de produto. O primeiro é obrigatório por lei (IP, data/hora, duração — mínimo 6 meses). O segundo segue LGPD, minimização e base legal explícita.
Mapa de telemetria
Antes de discutir SDK, mapeie cada evento que sai do app:
| Categoria | Dados típicos | Base legal (LGPD) | Consentimento? |
|---|---|---|---|
| Logs de acesso (MCI) | IP, data/hora, duração, porta | Obrigação legal (Art. 7º, II) | Não — retenção mínima 6 meses |
| Crash / diagnóstico | Stack trace, modelo, versão SO, memória | Legítimo interesse (Art. 7º, IX) | Não — exige opt-out acessível |
| Analytics funcional | Telas visitadas, tempo, contagem de eventos | Legítimo interesse ou execução de contrato | Não, se minimizado e sem profiling |
| Ads / atribuição | IDFA, GAID, histórico cross-app | Consentimento (Art. 7º, I) | Sim — opt-in prévio (ATT no iOS) |
| Biometria / KYC | Hash biométrico, vetor facial | Art. 11 — consentimento destacado ou prevenção à fraude | Depende do contexto |
Se o evento não cabe em nenhuma linha, pare. Evento sem classificação não sobe para produção.
Base legal na prática
Quando legítimo interesse funciona
Crash reports, métricas de latência, consumo de memória e erros de rede costumam se encaixar em legítimo interesse — desde que:
- a finalidade seja concreta ("corrigir crash na tela X"), não genérica ("melhorias futuras");
- você colete o mínimo (sem PII no stack trace);
- exista opt-out simples nas configurações do app.
A ANPD, no guia de cookies, reconhece que ferramentas de medição imprescindíveis ao funcionamento podem usar legítimo interesse com transparência e opção de oposição.
Quando exige consentimento
Ative consentimento (e no iOS, o prompt ATT) quando o fluxo envolve:
- IDFA ou GAID para ads/remarketing;
- rastreamento entre apps ou sites;
- profiling para publicidade direcionada;
- compartilhamento com data brokers.
Sem opt-in, o SDK até pode disparar — mas o tratamento é irregular.
Para entender por que hash de device ID não resolve o problema sozinho:
Guia de anonimização e privacidade em analytics mobile e web
Teste de balanceamento (LIA) em 3 passos
Para telemetria baseada em legítimo interesse, documente um LIA simplificado antes de liberar evento novo:
1. Finalidade
Responda: "Este dado resolve qual problema técnico concreto?"
Ruim: "Coletar métricas para eventuais melhorias."
Bom: "Identificar crash em CheckoutActivity na versão 2.4.1 com Android 14."
2. Necessidade
Responda: "Existe forma menos invasiva de chegar ao mesmo diagnóstico?"
Se dá para usar contadores agregados ou excluir identificador persistente, faça. Coletar IMEI para saber que a tela travou é desproporcional.
3. Balanceamento
Pondere interesse do controlador vs expectativa do usuário. Salvaguardas mínimas:
- pseudonimização na origem;
- prazo de retenção curto (30–90 dias para crash);
- opt-out visível;
- criptografia TLS 1.3 em trânsito.
Registre isso no RoPA (Registro de Operações, Art. 37). Evento no código sem linha no RoPA é dívida de compliance.
Arquitetura técnica
Traduza Privacy by Design (Art. 46) em pipeline:
- Evento no app — dispara localmente.
- Filtro de minimização — remove PII, trunca IP, substitui device ID por token salgado.
- Gate de consentimento — ads/IDFA só passam com opt-in; crash segue com LI + opt-out.
- Destinos separados — logs MCI em storage isolado (6 meses); analytics em ambiente distinto.
No iOS, o gate de ads passa pelo prompt nativo do ATT. No Android, controle GAID via APIs de advertising ID e painel in-app.
Técnicas que funcionam na prática:
- Hash salgado com rotação — substitui identificador direto por token de via única; rotaciona o salt periodicamente.
- Edge processing — agrega contadores no device antes de enviar (ex.: "3 telas visitadas" em vez de log linha a linha).
- IP anonymization — truncar ou descartar IP antes de persistir no vendor.
Governança de SDKs
Firebase Analytics, Crashlytics, Adjust, Sentry e Mapbox são controlados por você na qualidade de controlador — não de "usuário passivo do vendor".
Checklist de auditoria:
- Proxy de tráfego — Charles, mitmproxy ou Proxyman na build de debug; inspecione payload na primeira abertura.
- Desabilitar auto-collect —
setAnalyticsCollectionEnabled(false)até consentimento; equivalentes nos MMPs. - Suprimir IDFA/GAID — não inicialize módulos de ads sem opt-in.
- Alinhar manifestos —
PrivacyInfo.xcprivacy(iOS) e Data Safety (Android) devem refletir o tráfego real. - Contratos — SCCs ou cláusulas adequadas se o vendor processa fora do Brasil (Art. 33).
Para o passo técnico de configuração de SDKs:
Firebase e SDKs mobile: guia curto para tech leads
Consentimento no app
No mobile, espaço de tela é curto — use aviso em camadas, como recomenda a ANPD:
Primeiro nível (banner no onboarding):
- resumo claro das finalidades;
- botões com igual destaque visual: "Aceitar todos", "Rejeitar não necessários", "Gerenciar preferências";
- nada de botão verde gigante para aceite e link escondido para recusar.
Segundo nível (painel de preferências):
- categorias separadas: Essencial, Analytics, Publicidade;
- toggles desligados por padrão para tudo que depende de consentimento;
- revogação permanente em Configurações → Privacidade.
Os padrões de consentimento em camadas na web seguem a mesma lógica:
Consent Mode v2 sem quebrar métricas no GA4
Exigências das lojas
| Exigência | Apple iOS | Google Android |
|---|---|---|
| Declaração pública de dados | Privacy Nutrition Labels | Data Safety Section |
| Tracking cross-app | ATT (prompt nativo) | Controle de GAID + declaração |
| Transparência de APIs | Privacy Manifests (PrivacyInfo.xcprivacy) |
Play SDK Index compliance |
| Coerência código × loja | Required Reason APIs documentadas | Formulário alinhado ao tráfego real |
Rejeição na loja costuma ser o primeiro sinal. Notificação da ANPD é o segundo — e mais caro.
Checklist rápido
| # | Validação | Feito quando... |
|---|---|---|
| 1 | Inventário (RoPA) | Cada evento tem finalidade, base legal e retenção documentados |
| 2 | LIA | Fluxos de LI passaram pelos 3 testes e têm opt-out |
| 3 | SDK audit | Proxy confirmou payload; auto-collect desligado até consentimento |
| 4 | PETs | IP truncado, IDs pseudonimizados, agregação local onde possível |
| 5 | UI de consentimento | Banner + painel granular, opt-in puro, sem dark patterns |
| 6 | Lojas | Privacy Manifest / Data Safety batem com o código compilado |
Próximo passo
Telemetria compliant não é "desligar analytics". É separar fluxos, documentar bases legais e provar que o que está na loja é o que roda no app.
Use o checklist acima como diagnóstico interno. Se você está subindo evento novo ou herdou um app com cinco SDKs no init, o movimento seguinte é mapear inventário, auditar tráfego e redesenhar a pipeline com gates de consentimento — antes da próxima release ou revisão da loja.
Se quiser uma leitura externa da implementação, peça uma auditoria de eventos app/web: o objetivo é medir com utilidade técnica e sair do risco de compliance cosmético.