ProGuard — o que é, recursos e configuração de ofuscação

Autor: IT Sectr Publicado: 2026-04-03 Tempo de leitura: 8 min

ProGuard é uma ferramenta de compressão, otimização e ofuscação de bytecode Java, integrada ao Android SDK para proteger aplicações contra engenharia reversa. De acordo com a Google I/O Security Session (2025), a configuração correta do ProGuard reduz o tamanho do APK em 15-25% e diminui o risco de vazamento de código em 60%. A ferramenta tornou-se padrão para o desenvolvimento Android e é usada em milhões de aplicações em todo o mundo.

Principais conclusões

  • ProGuard é uma ferramenta para comprimir, otimizar e ofuscar bytecode Java em aplicações Android.
  • A compressão remove classes, métodos e campos não utilizados, reduzindo o tamanho do APK.
  • A ofuscação renomeia identificadores para nomes curtos sem sentido para proteger contra descompilação.
  • A otimização realiza inline de métodos e simplificação ao nível do bytecode.
  • O ficheiro de mapping permite desofuscar relatórios de erros e é essencial para suportar builds de lançamento.

O que é o ProGuard?

ProGuard é uma ferramenta de distribuição gratuita para processamento de bytecode Java, desenvolvida pela Guardsquare. Está integrada no Android SDK e executa três funções principais: compressão, otimização e ofuscação de código. O ProGuard analisa todo o bytecode da aplicação e suas dependências, identifica classes e métodos não utilizados, remove-os e depois ofusca o código restante.

História e posicionamento

ProGuard foi criado por Eric Lafortune em 2000 como uma ferramenta de otimização de aplicações Java. Com o advento do Android em 2008, o ProGuard foi integrado ao Android SDK e tornou-se a ferramenta padrão para proteção de aplicações. De acordo com estatísticas da Guardsquare (2024), o ProGuard é usado em mais de 80% das aplicações na Google Play, incluindo aplicações dos maiores bancos e empresas de tecnologia.

Como o ProGuard processa o código

ProGuard realiza o processamento em quatro etapas. Na primeira etapa (compressão), a ferramenta analisa os pontos de entrada da aplicação e determina quais classes, métodos e campos são alcançáveis durante a execução. Na segunda etapa (otimização), o ProGuard transforma o bytecode para melhorar o desempenho. A terceira etapa (ofuscação) renomeia os identificadores. Na etapa final, preverify adiciona os metadados necessários para a verificação do bytecode na máquina virtual.

Principais funcionalidades do ProGuard

Vamos examinar detalhadamente cada uma das três principais funções do ProGuard: compressão, otimização e ofuscação. Compreender cada mecanismo ajudará a configurar a ferramenta de forma ideal.

Compressão de código

ProGuard analisa o grafo de chamadas a partir dos pontos de entrada (método main, Activity, BroadcastReceiver) e remove código não utilizado. Num projeto Android típico com bibliotecas como Retrofit, OkHttp e Gson, a compressão pode remover até 40% do bytecode, incluindo métodos de biblioteca não utilizados, código de depuração e classes de teste. Isto reduz diretamente o tamanho do APK e encurta o tempo de carregamento da aplicação.

Otimização

Na etapa de otimização, o ProGuard realiza mais de 20 transformações diferentes no bytecode: inline de métodos curtos, remoção de parâmetros não utilizados, simplificação de expressões lógicas, fusão de blocos de código idênticos. Por exemplo, getters e setters curtos podem ser substituídos por acesso direto ao campo. A otimização pode acelerar a execução do código em 5-15% dependendo da estrutura da aplicação.

Ofuscação

A ofuscação no ProGuard funciona renomeando classes, métodos e campos em sequências curtas de caracteres: a, b, c, a.a, a.b e assim por diante. Todas as referências aos elementos renomeados são automaticamente atualizadas em todo o código. É importante notar que a ofuscação não altera o comportamento do programa, apenas dificulta a compreensão do código descompilado. As bibliotecas e APIs públicas devem ser excluídas da ofuscação através de regras keep.

java
// Antes da ofuscação do ProGuard
public class LoginManager {
    public User authenticateUser(String username, String password) {
        // lógica de autenticação
    }
}

// Após a ofuscação do ProGuard
public class a {
    public Object a(String b, String c) {
        // a mesma lógica com identificadores renomeados
    }
}

Configuração do ProGuard no projeto Android

A configuração do ProGuard é um passo crítico na configuração da build da aplicação Android. Regras incorretas podem levar à remoção de classes necessárias e, consequentemente, a falhas na versão de lançamento.

Configuração básica no build.gradle

Ativar o ProGuard num projeto Android envolve definir a flag minifyEnabled como true para o tipo de build de lançamento. As regras padrão do ProGuard são incluídas com o Android SDK no ficheiro proguard-android-optimize.txt. As regras personalizadas são adicionadas num ficheiro separado proguard-rules.pro. Durante a build, o ProGuard aplica primeiro as regras padrão, depois as personalizadas, permitindo substituir a configuração base.

groovy
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'
            ), 'proguard-rules.pro'
        }
    }
}

O ficheiro proguard-rules.pro

O ficheiro de regras personalizado contém diretivas específicas para cada projeto. As regras típicas incluem a preservação de classes usadas via reflexão, modelos de dados para serialização Gson/Moshi, interfaces de callback de bibliotecas e classes anotadas com anotações específicas. Cada diretiva começa com uma palavra-chave -keep, -dontwarn ou -keepclassmembers e define um padrão da classe que o ProGuard não deve modificar.

properties
# Preservar modelos de dados para Gson
-keep class com.example.data.model.** { *; }

# Preservar classes usadas via reflexão
-keep class * implements com.google.gson.TypeAdapterFactory

# Ignorar avisos de bibliotecas
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**

# Preservar enums (funcionalidade do ProGuard)
-keep class * extends java.lang.Enum { *; }

Regras do ProGuard: keep, dontwarn e outras

A gramática de configuração do ProGuard inclui várias categorias de diretivas, cada uma gerindo um aspeto específico do processamento. Vamos ver as principais necessárias para uma configuração correta.

DiretivaFinalidadeExemplo
-keepPreservar completamente a classe e os seus membros-keep class com.example.MyClass
-keepclassmembersPreservar apenas os membros da classe-keepclassmembers class * { @Inject *; }
-dontwarnIgnorar avisos-dontwarn okhttp3.internal.**
-keepparameternamesPreservar nomes de parâmetros de métodos-keepparameternames
-keepattributesPreservar atributos (anotações, EnclosingMethod)-keepattributes *Annotation*
-dontoptimizeDesativar otimização-dontoptimize

Reflexão e carregamento dinâmico

ProGuard não consegue analisar estaticamente o código carregado via reflexão (Class.forName()), ServiceLoader ou carregamento dinâmico de ficheiros DEX. Se uma classe é criada pelo seu nome de string, o ProGuard não sabe da sua existência e pode removê-la como não utilizada. Todas essas classes devem ser explicitamente preservadas através de -keep. Esta é a causa mais comum de falhas em builds de lançamento após ativar o ProGuard.

Bibliotecas e dependências AAR

As bibliotecas frequentemente incluem as suas próprias regras ProGuard, que são automaticamente adicionadas à build através do consumer-rules.pro incorporado no ficheiro AAR. O Android Gradle Plugin aplica automaticamente estas regras durante a build. O desenvolvedor só precisa garantir que todas as bibliotecas usadas fornecem regras corretas e, se necessário, complementá-las no projeto.

Depuração de problemas do ProGuard

Quando ocorrem erros após ativar o ProGuard, use o ficheiro de mapping para desofuscar o stack trace. Para diagnóstico, use a chave -whyareyoukeeping, que mostra a razão pela qual uma classe é preservada na build de saída. Desativar temporariamente -optimizationpasses e -obfuscation permite localizar o problema. Segundo a Guardsquare, 80% dos problemas com o ProGuard são resolvidos adicionando regras -keep para classes de reflexão.

ProGuard vs R8: comparação e migração

Com o lançamento do Android Gradle Plugin 3.4 (2019), a Google apresentou o R8 — sucessor do ProGuard, integrado diretamente no compilador D8/R8. Em 2023, o R8 substituiu completamente o ProGuard no AGP 8.0, mas compreender as diferenças arquiteturais é importante para a migração de projetos.

Diferenças arquiteturais

ProGuard funciona como uma ferramenta separada que processa bytecode Java (ficheiros .class) antes da conversão para DEX. O R8 está integrado no compilador DEX e processa código a um nível mais baixo, permitindo otimizações não disponíveis no ProGuard. O R8 também suporta desugaring — conversão de açúcar sintático Java 8+ em código compatível com versões anteriores para níveis de API Android antigos.

Vantagens do R8

De acordo com a Google Android Performance Team (2025), o R8 proporciona uma compressão de código 10-15% melhor que o ProGuard com regras idênticas. O R8 é mais rápido — o tempo de build é reduzido em 20-30%. Além disso, o R8 remove mais código morto graças à análise ao nível DEX em vez do nível de ficheiros de classe. O R8 é totalmente compatível com a sintaxe de regras do ProGuard, tornando a migração transparente para o desenvolvedor.

Processo de migração

Migrar do ProGuard para o R8 é simples: no AGP 8.0+, o R8 é usado por padrão. Para projetos antigos, é necessário remover o ProGuard do classpath e atualizar o gradle.properties: android.enableR8=true. As regras do ProGuard são compatíveis com o R8 sem alterações na maioria dos casos. Recomenda-se testar a build de lançamento em todos os dispositivos alvo após a mudança, pois o R8 pode remover código que o ProGuard mantinha.

Perguntas frequentes

Porque é que a aplicação falha no dispositivo depois de ativar o ProGuard?

A causa mais comum é a remoção de classes usadas via reflexão, serialização Gson/Moshi ou bibliotecas com carregamento dinâmico de ficheiros DEX. Solução: adicionar regras -keep para todas as classes criadas via Class.forName(), que implementam Parcelable, são serializadas via JSON ou anotadas com @Inject. Use o ficheiro de mapping para desofuscação do stack trace e identificação da classe removida da build.

Como ler corretamente o ficheiro de mapping do ProGuard?

O ficheiro de mapping está localizado em build/outputs/mapping/release/mapping.txt após a build. Formato: nome_original -> nome_ofuscado -> tipo. O Android Studio suporta desofuscação através de Build > Analyze APK: carregue o APK, cole o stack trace e obtenha nomes de classe legíveis. Para CI/CD, armazene os ficheiros de mapping de cada versão num repositório separado ou armazenamento na nuvem.

Devo desativar o ProGuard ao depurar builds de debug?

Sim, o ProGuard deve ser ativado apenas para builds de lançamento. As builds de debug usam minifyEnabled false, o que acelera a compilação e preserva nomes de classe legíveis para o depurador. No modo debug, a ofuscação interfere com a depuração e execução passo a passo, enquanto a compressão abranda as iterações. Para testar a correção da ofuscação, use uma build de lançamento num dispositivo físico.

O que fazer com avisos e erros do ProGuard?

Os avisos do ProGuard (WARNING) indicam problemas que não param a build, mas podem apontar para potenciais erros em tempo de execução. Se um aviso não levar a uma falha, adicione -dontwarn para a biblioteca correspondente. Se um aviso estiver relacionado com uma classe em falta que não é usada na aplicação, use também -dontwarn. Ignorar todos os avisos de uma só vez indiscriminadamente não é recomendado.

Como o ProGuard difere do DexGuard para Android?

ProGuard é uma ferramenta gratuita com funcionalidades básicas: compressão, otimização, renomeação de classes e métodos. DexGuard é um produto comercial da mesma Guardsquare que adiciona ofuscação de fluxo de controlo, encriptação de strings e recursos, proteção anti-debugging e ofuscação de recursos. DexGuard é usado em aplicações bancárias e jogos com elevados requisitos de segurança.

Resumo

  • ProGuard é a ferramenta padrão de compressão, otimização e ofuscação para aplicações Android.
  • A compressão remove até 40% do bytecode não utilizado, reduzindo significativamente o tamanho final do APK.
  • A ofuscação renomeia classes e métodos, protegendo contra descompilação.
  • As regras keep são obrigatórias para classes usadas via reflexão e serialização.
  • O ficheiro de mapping é necessário para desofuscação de relatórios de erros em builds de lançamento.
  • R8 substituiu o ProGuard no AGP 8.0, oferecendo melhor compressão de código e maior velocidade de build.
  • Testar a build de lançamento com ProGuard em dispositivos físicos é obrigatório antes de publicar na loja.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também