Cómo agregar opciones globales

R8 proporciona opciones globales que modifican las optimizaciones de R8 en toda la app o afectan a cada regla de conservación. Estas opciones se mantienen en el archivo proguard-rules.pro, junto con las reglas de conservación. Algunas de estas opciones globales configuran una optimización adicional, mientras que otras desactivan ciertos aspectos de la optimización.

Opciones globales para la optimización adicional

Las siguientes opciones globales habilitan la optimización adicional:

  • -repackageclasses [<optional-package-name>]: Reempaqueta las clases en un solo paquete especificado para reducir aún más el tamaño de la app. Si no proporcionas el nombre del paquete opcional, las clases se moverán al paquete predeterminado vacío. Este es un parámetro de configuración recomendado para las apps.
  • -allowaccessmodification: Permite que R8 cambie (por lo general, amplíe) la visibilidad de las clases, los campos y los métodos para realizar optimizaciones más extensas. Se habilita cuando se usa proguard-android-optimize.txt. Desde el complemento de Android para Gradle (AGP) 8.2, esta es la configuración predeterminada si usas R8 en modo completo.

A continuación, se muestra un ejemplo de una configuración con optimización adicional habilitada:

-repackageclasses
-allowaccessmodification

Opciones globales para limitar la optimización

Las siguientes opciones globales te permiten desactivar ciertos aspectos de la optimización de la app y son útiles cuando ajustas tus reglas de conservación o activas R8 por primera vez.

  • -dontoptimize: Evita la optimización del código, por ejemplo, la inserción de métodos. Esta opción se puede usar durante el desarrollo, pero no en las compilaciones de producción.
  • -dontshrink: Evita la eliminación de código no referenciado y las optimizaciones de código. Esta opción se puede usar durante el desarrollo, pero no en las compilaciones de producción.
  • -dontobfuscate: Evita acortar los nombres de las clases y los métodos. Puede ser especialmente útil desactivar la ofuscación durante la depuración para que los seguimientos de pila sean más fáciles de leer. Esta opción se puede usar durante el desarrollo, pero no en las compilaciones de producción.
  • -keepattributes <attributes>: Acepta una lista de atributos separados por comas que se deben conservar. Si no usas el proguard-android-optimize.txt predeterminado, R8 quita todos los atributos, incluidos RuntimeVisibleAnnotations y Signature. Sin embargo, puede ser útil conservar estos atributos si se necesitan en casos como la reflexión. Para obtener una lista de los atributos que puedes especificar, consulta Atributos de conservación.

Conservar atributos

Los atributos son fragmentos de información adicionales que se adjuntan a diferentes partes de tu código. Los atributos almacenan información, como anotaciones y firmas genéricas de tu código.

Algunas operaciones de reflexión requieren que se conserven atributos específicos para que se ejecuten correctamente. Por ejemplo:

  • Cuando se accede a la estructura de la clase interna o externa con getEnclosingMethod() o getDeclaredClasses(), se necesitan los atributos EnclosingMethod y InnerClasses.
  • Cuando se accede a firmas genéricas con getTypeParameters(), se necesita el atributo Signature.
  • Cuando se accede a las anotaciones con getAnnotation(), se necesita el atributo RuntimeVisibleAnnotations.

Atributos que se suelen requerir

Cuando se usa el archivo ProGuard predeterminado (proguard-android-optimize.txt o proguard-android.txt), el complemento de Android para Gradle (AGP) conserva los siguientes atributos. Ten en cuenta que algunos de estos atributos requieren versiones más recientes de AGP:

Atributo Descripción
AnnotationDefault Este atributo se encuentra en los tipos de anotación y almacena el valor predeterminado de un elemento de anotación.

Nota: Este atributo se mantiene de forma predeterminada desde AGP 7.1 y solo debe mantenerse de forma explícita en las apps que usan versiones anteriores de AGP.
EnclosingMethod Este atributo está presente en las clases internas que no son locales ni anónimas. Identifica el método o el inicializador que contiene inmediatamente la clase.
InnerClasses Este atributo registra información sobre las clases anidadas (clases internas, clases anidadas estáticas, clases locales y clases anónimas) definidas dentro de otra clase.
LineNumberTable Este atributo asigna instrucciones de bytecode a sus números de línea correspondientes en el archivo fuente original.

Nota: Este atributo se conserva de forma predeterminada desde la versión 8.6 del complemento de Android para Gradle (AGP) y solo debe conservarse de forma explícita en las apps que usan versiones anteriores del AGP.
RuntimeVisibleAnnotations Este atributo almacena anotaciones que son visibles en el tiempo de ejecución por reflexión.

Por lo general, si las anotaciones se usan en el tiempo de ejecución, esta es la única anotación de los atributos *Annotation que necesitan las apps y las reglas de consumidor de la biblioteca.
RuntimeVisibleParameterAnnotations Este atributo almacena anotaciones que son visibles en el tiempo de ejecución por reflexión sobre los parámetros de un método.
RuntimeVisibleTypeAnnotations Este atributo almacena anotaciones que se aplican a usos de tipos en lugar de solo declaraciones. Este atributo es visible en el tiempo de ejecución.
Signature Este atributo almacena una firma de tipo más genérica para clases, métodos y campos, en especial cuando usan genéricos (como List<String>).
SourceFile Este atributo almacena el nombre del archivo fuente (archivo .kt o .java) desde el que se compiló una clase. Los depuradores lo usan principalmente para mostrar las líneas de código fuente originales cuando se ejecuta paso a paso el código Java compilado. Ayuda a los desarrolladores a rastrear la ejecución hasta el código que escribieron.

Nota: Este atributo se conserva de forma predeterminada desde AGP 8.2 y solo debe conservarse de forma explícita en las apps que usan versiones anteriores de AGP.

En el caso de las apps que usan proguard-android-optimize.txt, las reglas de conservación definidas por AGP son adecuadas en la mayoría de los casos. Sin embargo, si escribes código para una biblioteca, debes especificar todos los atributos que requiere tu biblioteca en sus reglas de conservación del consumidor, incluso si se definen en esta lista. Esto garantiza que tu biblioteca sea sólida si los desarrolladores deciden no incluir proguard-android-optimize.txt.

Atributos de conservación adicionales

Puedes especificar atributos adicionales para que se conserven, pero no son necesarios para la gran mayoría de las situaciones de acceso a JNI o de reflexión. Sin embargo, es posible que algunas de ellas se sigan usando con frecuencia mientras se optimizan las bibliotecas.

Atributo Descripción
MethodParameters Este atributo proporciona información sobre los parámetros de un método, específicamente sus nombres y marcas de acceso.
Exceptions Este atributo enumera las excepciones verificadas que se declaran que genera un método.

Por lo general, este atributo no se usa para las apps. Para los autores de bibliotecas, no se suele usar en las reglas de conservación del consumidor, pero sí cuando se compilan bibliotecas. Para obtener detalles sobre la optimización de bibliotecas, consulta Optimization for library authors.
RuntimeInvisibleAnnotations Este atributo almacena anotaciones que no son visibles con la reflexión en el tiempo de ejecución en una clase, un campo o un método.

Los desarrolladores de apps no deben conservar este atributo. Para los autores de bibliotecas, este atributo no es relevante en las reglas de conservación del consumidor, pero se usa a menudo cuando se compilan bibliotecas. Para obtener detalles sobre la optimización de bibliotecas, consulta Optimization for library authors.
RuntimeInvisibleParameterAnnotations Este atributo almacena anotaciones que no son visibles con la reflexión en el tiempo de ejecución en los parámetros de un método.

Los desarrolladores de apps no deben conservar este atributo. Para los autores de bibliotecas, este atributo no es relevante en las reglas de conservación del consumidor, pero se usa a menudo cuando se compilan bibliotecas. Para obtener detalles sobre la optimización de bibliotecas, consulta Optimization for library authors.
RuntimeInvisibleTypeAnnotations Este atributo almacena anotaciones que se aplican a usos de tipos en lugar de solo declaraciones. Este atributo no está visible en el tiempo de ejecución.

Los desarrolladores de apps no deben conservar este atributo. Para los autores de bibliotecas, este atributo no es relevante en las reglas de conservación del consumidor, pero se usa a menudo cuando se compilan bibliotecas. Para obtener detalles sobre la optimización de bibliotecas, consulta Optimization for library authors.