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 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.
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.
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.
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.
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.
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.
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.
// 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
}
}
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.
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.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), '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.
# 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 { *; }
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.
| Diretiva | Finalidade | Exemplo |
|---|---|---|
| -keep | Preservar completamente a classe e os seus membros | -keep class com.example.MyClass |
| -keepclassmembers | Preservar apenas os membros da classe | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Ignorar avisos | -dontwarn okhttp3.internal.** |
| -keepparameternames | Preservar nomes de parâmetros de métodos | -keepparameternames |
| -keepattributes | Preservar atributos (anotações, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Desativar otimização | -dontoptimize |
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Leia também