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.
R8 también acepta, pero ignora, algunas opciones heredadas de ProGuard. Para obtener más información, consulta Cómo quitar las opciones heredadas de ProGuard.
Opciones globales para la optimización adicional
Las siguientes opciones globales habilitan la optimización adicional:
-repackageclasses [<optional-package-name>]: Vuelve a empaquetar las clases en un solo paquete para reducir el tamaño de la app. Si no proporcionas el nombre del paquete opcional, las clases se moverán al paquete sin nombre (predeterminado). Este es el parámetro de configuración recomendado para las apps, ya que genera archivos DEX más pequeños al omitir el prefijo del paquete de los nombres de las clases. Desde el complemento de Android para Gradle (AGP) 9.1, esta es la configuración predeterminada para las apps. Para inhabilitar esta optimización, usa-dontrepackage.-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 usaproguard-android-optimize.txt. Desde el complemento de Android para Gradle (AGP) 8.2, esta es la configuración predeterminada si habilitas la optimización completa con R8.-processkotlinnullchecks [level]: Permite que R8 cambie las verificaciones nulas de Kotlin Intrinsics para quitar el mensaje de error o quitar por completo la verificación nula explícita.Los valores de
level, ordenados del más débil al más fuerte, tienen el siguiente efecto:keepno cambia las verificaciones.remove_messagereescribe cada llamada al método de verificación como una llamada agetClass()en el primer argumento de la llamada (lo que mantiene la verificación de nulos, pero sin ningún mensaje).removequita por completo las verificaciones.
De forma predeterminada, R8 usa
remove_message. Cualquier especificación de-processkotlinnullchecksanula eso. Si se especifica varias veces, se usa el valor más fuerte.-processkotlinnullcheckses compatible con AGP 9.0.0.
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 que se acorten 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 elproguard-android-optimize.txtpredeterminado, R8 quita todos los atributos, incluidosRuntimeVisibleAnnotationsySignature. Sin embargo, puede ser útil conservar estos atributos si son necesarios en casos como la reflexión. Para obtener una lista de los atributos que puedes especificar, consulta Keep attributes.
Conservar atributos
Los atributos son datos adicionales adjuntos 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()ogetDeclaredClasses(), se necesitan los atributosEnclosingMethodyInnerClasses. - Cuando se accede a firmas genéricas con
getTypeParameters(), se necesita el atributoSignature. Cuando se accede a las anotaciones con
getAnnotation(), se necesita el atributoRuntimeVisibleAnnotations.
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 del 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 conserva de forma predeterminada desde AGP 7.1 y solo debe conservarse 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 a 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 elementos 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 ejecutan 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 que se conservarán, 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 estas 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 un método arroja. 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 a declaraciones. Este atributo no es 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. |
Cómo quitar las opciones heredadas de ProGuard
R8 acepta algunas opciones que solo tenían efecto en ProGuard, pero las ignora.
Estas opciones suelen permanecer en configuraciones que se migraron desde ProGuard o se copiaron de proyectos anteriores. Como no tienen ningún efecto en el resultado de R8, quítalos del archivo proguard-rules.pro para que tu configuración sea más fácil de comprender y mantener.
R8 ignora las siguientes opciones sin informar una advertencia:
-adaptkotlinmetadata-android-dontpreverify-dontskipnonpubliclibraryclasses-dontskipnonpubliclibraryclassmembers-dontusemixedcaseclassnames-forceprocessing-mergeinterfacesaggressively-optimizationpasses-optimizations-overloadaggressively-target-verbose
R8 ignora las siguientes opciones y muestra una advertencia durante la compilación:
-addconfigurationdebugging(la compatibilidad se quitó en AGP 9.0)-assumenoescapingparameters-assumenoexternalreturnvalues-assumenoexternalsideeffects-dump-useuniqueclassmembernames
R8 no admite -skipnonpubliclibraryclasses y muestra un error si tu configuración lo contiene.