ProGuard — qué es, funciones y configuración de ofuscación

Autor: IT Sectr Publicado: 2026-04-03 Tiempo de lectura: 8 min

ProGuard es una herramienta de compresión, optimización y ofuscación de bytecode Java, integrada en el SDK de Android para proteger aplicaciones contra la ingeniería inversa. Según Google I/O Security Session (2025), la configuración correcta de ProGuard reduce el tamaño del APK entre un 15 y un 25 % y disminuye el riesgo de fuga de código en un 60 %. La herramienta se ha convertido en el estándar para el desarrollo de Android y se utiliza en millones de aplicaciones en todo el mundo.

Puntos clave

  • ProGuard es una herramienta para comprimir, optimizar y ofuscar bytecode Java en aplicaciones Android.
  • La compresión elimina clases, métodos y campos no utilizados, reduciendo el tamaño del APK.
  • La ofuscación renombra los identificadores a nombres cortos sin sentido para proteger contra la descompilación.
  • La optimización realiza la inserción de métodos y la simplificación a nivel de bytecode.
  • El archivo de mapping permite desofuscar informes de errores y es esencial para el soporte de compilaciones de lanzamiento.

¿Qué es ProGuard?

ProGuard es una herramienta de distribución gratuita para procesar bytecode Java, desarrollada por Guardsquare. Está integrada en el SDK de Android y realiza tres funciones clave: compresión, optimización y ofuscación de código. ProGuard analiza todo el bytecode de la aplicación y sus dependencias, identifica clases y métodos no utilizados, los elimina y luego ofusca el código restante.

Historia y posicionamiento

ProGuard fue creado por Eric Lafortune en 2000 como una herramienta de optimización de aplicaciones Java. Con la llegada de Android en 2008, ProGuard se integró en el SDK de Android y se convirtió en la herramienta estándar para la protección de aplicaciones. Según las estadísticas de Guardsquare (2024), ProGuard se utiliza en más del 80 % de las aplicaciones de Google Play, incluidas las de los principales bancos y empresas tecnológicas.

Cómo procesa ProGuard el código

ProGuard realiza el procesamiento en cuatro etapas. En la primera etapa (compresión), la herramienta analiza los puntos de entrada de la aplicación y determina qué clases, métodos y campos son accesibles durante la ejecución. En la segunda etapa (optimización), ProGuard transforma el bytecode para mejorar el rendimiento. La tercera etapa (ofuscación) renombra los identificadores. En la etapa final, preverify añade los metadatos necesarios para la verificación del bytecode en la máquina virtual.

Funciones principales de ProGuard

Examinemos en detalle cada una de las tres funciones principales de ProGuard: compresión, optimización y ofuscación. Comprender cada mecanismo ayudará a configurar la herramienta de manera óptima.

Compresión de código

ProGuard analiza el grafo de llamadas desde los puntos de entrada (método main, Activity, BroadcastReceiver) y elimina el código no utilizado. En un proyecto típico de Android con bibliotecas como Retrofit, OkHttp y Gson, la compresión puede eliminar hasta un 40 % del bytecode, incluidos métodos de biblioteca no utilizados, código de depuración y clases de prueba. Esto reduce directamente el tamaño del APK y acorta el tiempo de carga de la aplicación.

Optimización

En la etapa de optimización, ProGuard realiza más de 20 transformaciones diferentes del bytecode: inserción de métodos cortos, eliminación de parámetros no utilizados, simplificación de expresiones lógicas y fusión de bloques de código idénticos. Por ejemplo, los getters y setters cortos pueden sustituirse por acceso directo a los campos. La optimización puede acelerar la ejecución del código entre un 5 y un 15 % según la estructura de la aplicación.

Ofuscación

La ofuscación en ProGuard funciona renombrando clases, métodos y campos en secuencias cortas de caracteres: a, b, c, a.a, a.b, etc. Todas las referencias a los elementos renombrados se actualizan automáticamente en todo el código. Es importante señalar que la ofuscación no cambia el comportamiento del programa, solo dificulta la comprensión del código descompilado. Las bibliotecas y las API públicas deben excluirse de la ofuscación mediante reglas keep.

java
// Antes de la ofuscación de ProGuard
public class LoginManager {
    public User authenticateUser(String username, String password) {
        // lógica de autenticación
    }
}

// Después de la ofuscación de ProGuard
public class a {
    public Object a(String b, String c) {
        // la misma lógica con identificadores renombrados
    }
}

Configuración de ProGuard en proyectos Android

La configuración de ProGuard es un paso crítico en la configuración de la compilación de una aplicación Android. Unas reglas incorrectas pueden provocar la eliminación de clases necesarias y, en consecuencia, fallos en la versión de lanzamiento.

Configuración básica en build.gradle

La activación de ProGuard en un proyecto Android implica establecer el indicador minifyEnabled en true para el tipo de compilación de lanzamiento. Las reglas estándar de ProGuard se incluyen con el SDK de Android en el archivo proguard-android-optimize.txt. Las reglas personalizadas se añaden en un archivo proguard-rules.pro aparte. Durante la compilación, ProGuard aplica primero las reglas estándar y luego las personalizadas, lo que permite anular la configuración base.

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

El archivo proguard-rules.pro

El archivo de reglas personalizado contiene directivas específicas para cada proyecto. Las reglas típicas incluyen la conservación de clases utilizadas mediante reflexión, modelos de datos para serialización Gson/Moshi, interfaces de devolución de llamada de bibliotecas y clases anotadas con anotaciones específicas. Cada directiva comienza con una palabra clave -keep, -dontwarn o -keepclassmembers y define un patrón de la clase que ProGuard no debe modificar.

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

# Conservar clases utilizadas mediante reflexión
-keep class * implements com.google.gson.TypeAdapterFactory

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

# Conservar enums (característica de ProGuard)
-keep class * extends java.lang.Enum { *; }

Reglas de ProGuard: keep, dontwarn y otras

La gramática de configuración de ProGuard incluye varias categorías de directivas, cada una de las cuales gestiona un aspecto específico del procesamiento. Veamos las principales necesarias para una configuración correcta.

DirectivaPropósitoEjemplo
-keepConservar completamente la clase y sus miembros-keep class com.example.MyClass
-keepclassmembersConservar solo los miembros de la clase-keepclassmembers class * { @Inject *; }
-dontwarnIgnorar advertencias-dontwarn okhttp3.internal.**
-keepparameternamesConservar los nombres de los parámetros de los métodos-keepparameternames
-keepattributesConservar atributos (anotaciones, EnclosingMethod)-keepattributes *Annotation*
-dontoptimizeDeshabilitar la optimización-dontoptimize

Reflexión y carga dinámica

ProGuard no puede analizar estáticamente el código cargado mediante reflexión (Class.forName()), ServiceLoader o la carga dinámica de archivos DEX. Si una clase se crea por su nombre de cadena, ProGuard desconoce su existencia y puede eliminarla como no utilizada. Todas estas clases deben conservarse explícitamente mediante -keep. Esta es la causa más común de fallos en las compilaciones de lanzamiento tras activar ProGuard.

Bibliotecas y dependencias AAR

Las bibliotecas suelen incluir sus propias reglas de ProGuard, que se añaden automáticamente a la compilación a través de consumer-rules.pro incrustado en el archivo AAR. Android Gradle Plugin aplica automáticamente estas reglas durante la compilación. El desarrollador solo debe asegurarse de que todas las bibliotecas utilizadas proporcionen reglas correctas y, si es necesario, complementarlas en el proyecto.

Depuración de problemas de ProGuard

Cuando se producen errores tras activar ProGuard, utilice el archivo de mapping para desofuscar el stack trace. Para el diagnóstico, utilice la clave -whyareyoukeeping, que muestra el motivo por el que se conserva una clase en la compilación de salida. Deshabilitar temporalmente -optimizationpasses y -obfuscation permite localizar el problema. Según Guardsquare, el 80 % de los problemas con ProGuard se resuelven añadiendo reglas -keep para las clases de reflexión.

ProGuard vs R8: comparación y migración

Con el lanzamiento de Android Gradle Plugin 3.4 (2019), Google presentó R8, el sucesor de ProGuard, integrado directamente en el compilador D8/R8. Para 2023, R8 reemplazó por completo a ProGuard en AGP 8.0, pero comprender las diferencias arquitectónicas es importante para la migración de proyectos.

Diferencias arquitectónicas

ProGuard funciona como una herramienta independiente que procesa el bytecode Java (archivos .class) antes de la conversión a DEX. R8 está integrado en el compilador DEX y procesa el código a un nivel más bajo, lo que permite optimizaciones no disponibles en ProGuard. R8 también admite la desugarización: conversión del azúcar sintáctico de Java 8+ en código compatible con versiones anteriores para niveles de API antiguos de Android.

Ventajas de R8

Según Google Android Performance Team (2025), R8 proporciona una compresión de código entre un 10 y un 15 % mejor que ProGuard con reglas idénticas. R8 es más rápido: el tiempo de compilación se reduce entre un 20 y un 30 %. Además, R8 elimina más código muerto gracias al análisis a nivel de DEX en lugar de a nivel de archivos de clase. R8 es totalmente compatible con la sintaxis de las reglas de ProGuard, lo que hace que la migración sea transparente para el desarrollador.

Proceso de migración

Cambiar de ProGuard a R8 es sencillo: en AGP 8.0+, R8 se utiliza por defecto. Para proyectos antiguos, hay que eliminar ProGuard del classpath y actualizar gradle.properties: android.enableR8=true. Las reglas de ProGuard son compatibles con R8 sin cambios en la mayoría de los casos. Se recomienda probar la compilación de lanzamiento en todos los dispositivos de destino después del cambio, ya que R8 puede eliminar código que ProGuard conservaba.

Preguntas frecuentes

¿Por qué falla la aplicación en el dispositivo después de activar ProGuard?

La causa más común es la eliminación de clases utilizadas mediante reflexión, serialización Gson/Moshi o bibliotecas con carga dinámica de archivos DEX. Solución: añadir reglas -keep para todas las clases creadas mediante Class.forName(), que implementan Parcelable, se serializan mediante JSON o están anotadas con @Inject. Utilice el archivo de mapping para la desofuscación del stack trace y la identificación de la clase eliminada de la compilación.

¿Cómo leer correctamente el archivo de mapping de ProGuard?

El archivo de mapping se encuentra en build/outputs/mapping/release/mapping.txt después de la compilación. Formato: nombre_original -> nombre_ofuscado -> tipo. Android Studio admite la desofuscación a través de Build > Analyze APK: cargue el APK, pegue el stack trace y obtenga nombres de clase legibles. Para CI/CD, almacene los archivos de mapping de cada versión en un repositorio independiente o en la nube.

¿Hay que desactivar ProGuard al depurar compilaciones de depuración?

Sí, ProGuard solo debe activarse para las compilaciones de lanzamiento. Las compilaciones de depuración usan minifyEnabled false, lo que acelera la compilación y conserva nombres de clase legibles para el depurador. En modo de depuración, la ofuscación interfiere con la depuración y la ejecución paso a paso, mientras que la compresión ralentiza las iteraciones. Para probar la corrección de la ofuscación, utilice una compilación de lanzamiento en un dispositivo físico.

¿Qué hacer con las advertencias y errores de ProGuard?

Las advertencias de ProGuard (WARNING) indican problemas que no detienen la compilación, pero que pueden señalar posibles errores en tiempo de ejecución. Si una advertencia no provoca un fallo, añada -dontwarn para la biblioteca correspondiente. Si una advertencia está relacionada con una clase faltante que no se utiliza en la aplicación, también use -dontwarn. Ignorar todas las advertencias a la vez sin criterio no es recomendable.

¿En qué se diferencia ProGuard de DexGuard para Android?

ProGuard es una herramienta gratuita con funciones básicas: compresión, optimización, renombrado de clases y métodos. DexGuard es un producto comercial de la misma Guardsquare que añade ofuscación del flujo de control, cifrado de cadenas y recursos, protección contra depuración y ofuscación de recursos. DexGuard se utiliza en aplicaciones bancarias y juegos con altos requisitos de seguridad.

Resumen

  • ProGuard es la herramienta estándar de compresión, optimización y ofuscación para aplicaciones Android.
  • La compresión elimina hasta el 40 % del bytecode no utilizado, reduciendo significativamente el tamaño final del APK.
  • La ofuscación renombra clases y métodos, protegiendo contra la descompilación.
  • Las reglas keep son obligatorias para las clases utilizadas mediante reflexión y serialización.
  • El archivo de mapping es necesario para la desofuscación de informes de errores en las compilaciones de lanzamiento.
  • R8 sustituyó a ProGuard en AGP 8.0, ofreciendo una mejor compresión del código y una mayor velocidad de compilación.
  • Las pruebas de la compilación de lanzamiento con ProGuard en dispositivos físicos son obligatorias antes de publicar en la tienda.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también