Acerca de las reglas de conservación

Cuando habilitas la optimización de la app con la configuración predeterminada, R8 realiza optimizaciones exhaustivas para maximizar los beneficios de rendimiento. R8 realiza modificaciones importantes en el código, como cambiar el nombre, mover y quitar clases, campos y métodos. Si observas que estas modificaciones causan errores, debes especificar qué partes del código no debe modificar R8 declarándolas en reglas de conservación.

Situaciones comunes que requieren reglas de conservación

R8 identifica y conserva todas las llamadas directas en tu código. Sin embargo, R8 no puede ver los usos indirectos del código, lo que puede provocar que quite código que tu app necesita y, por lo tanto, que se produzcan fallas. Usa reglas de conservación para indicarle a R8 que conserve ese código que se usa de forma indirecta. A continuación, se indican algunas situaciones comunes en las que es probable que necesites reglas de conservación:

  • Código al que se accede por reflexión: R8 no puede identificar cuándo se accede a clases, campos o métodos con reflexión. Por ejemplo, R8 no puede identificar un método buscado por su nombre con Class.getDeclaredMethod() ni una anotación recuperada con Class.getAnnotation(). En estos casos, R8 podría cambiar el nombre de estos métodos y anotaciones, o bien quitarlos por completo, lo que generaría un ClassNotFoundException o un NoSuchMethodException en el tiempo de ejecución.
  • Código llamado desde la interfaz nativa de Java (JNI): Cuando el código nativo (C o C++) llama a un método de Java o Kotlin, o cuando el código de Java o Kotlin llama al código de C++ con JNI, la llamada se basa en una búsqueda dinámica de cadenas del nombre del método. R8 no puede ver la llamada al método dinámico basada en cadenas, por lo que sus optimizaciones podrían dañar tu código.

Esta no es una lista exhaustiva de las situaciones que requieren reglas de conservación, pero abarca la mayoría de los casos en los que podrías necesitarlas.

Cómo agregar reglas de conservación a tu app

Debes agregar tus reglas a un archivo proguard-rules.pro ubicado en el directorio raíz del módulo de la app. Es posible que el archivo ya esté allí, pero, si no es así, créalo. Para aplicar las reglas del archivo, debes declararlo en tu archivo build.gradle.kts (o build.gradle) a nivel del módulo, como se muestra en el siguiente código:

Kotlin

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile("proguard-android-optimize.txt"),

                // File with your custom rules
                "proguard-rules.pro"
            )
           // ...
        }
    }
    // ...
}

Groovy

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile('proguard-android-optimize.txt'),

                // File with your custom rules.
                'proguard-rules.pro'
            )
           // ...
        }
    }
    // ...
}

De forma predeterminada, el archivo de compilación también incluye el archivo proguard-android-optimize.txt. Este archivo incluye reglas que se requieren para la mayoría de los proyectos de Android, por lo que debes dejarlo en el archivo de compilación. Este archivo se basa en el archivo proguard-common.txt y comparte contenido con él.

Por lo general, las apps más grandes tienen código en varios módulos de biblioteca. En esos casos, suele ser mejor colocar las reglas de conservación junto con el código al que se aplican dentro del módulo de biblioteca específico. La diferencia crucial en el mantenimiento de las reglas de conservación para las bibliotecas radica en cómo declaras estas reglas dentro del archivo build.gradle.kts (o build.gradle) del módulo de tu biblioteca. Consulta Optimización para autores de bibliotecas para obtener más información.

Cómo agregar una regla de conservación

Cuando agregas reglas de conservación, puedes incluir opciones globales y definir tus propias reglas de conservación.

  • Opciones globales: Las opciones globales son directivas generales que afectan la forma en que R8 opera en toda tu base de código. Para obtener más información, consulta Opciones globales.
  • Reglas de conservación: Las reglas de conservación deben diseñarse con cuidado para garantizar que obtengas el equilibrio adecuado entre maximizar la optimización del código sin dañar tu app de forma inadvertida. Para conocer la sintaxis de tus propias reglas de conservación, consulta Sintaxis de las reglas de conservación.

Reglas de conservación para los autores de bibliotecas

Después de obtener información sobre las opciones globales y la sintaxis de las reglas de conservación, consulta Optimización para autores de bibliotecas para obtener más detalles.