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 usaproguard-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 elproguard-android-optimize.txt
predeterminado, R8 quita todos los atributos, incluidosRuntimeVisibleAnnotations
ySignature
. 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()
ogetDeclaredClasses()
, se necesitan los atributosEnclosingMethod
yInnerClasses
. - 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 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. |