Acelere la construcción: archivos R no transitivos
Todos los módulos de AGP 4.2 pueden utilizar archivos R no transitivos. Los archivos R no transitivos hacen que su compilación sea cada vez más rápida, y su AAB / APK es más pequeño. Este artículo explicará cómo implementar y construir su aplicación utilizando archivos R no transitivos.
¿Qué es no transitivo?
En matemáticas, No transitivo ¿Es el atributo de la relación binaria de la relación transitiva? Esto puede incluir cualquier relación no transitiva, o la propiedad más fuerte de anti-transitiva, que describe una relación que nunca se transmitirá.
https://en.wikipedia.org/wiki/Intransitivity
¿Nos ayuda esa cita matemática? tal vez no.Probemos esto: si Una especie de Dependiendo de Segundo con Segundo Dependiendo de C, Una especie de No lo sé C. En el mundo de Android, archivos R intransferibles:
La clase R no transitiva habilita el espacio de nombres de la clase R de cada biblioteca, de modo que su clase R solo contiene recursos declarados en la biblioteca misma, y no recursos de dependencias de biblioteca, reduciendo así el tamaño de la clase R de la biblioteca.
Esta publicación de blog no trata sobre el principio de funcionamiento de los archivos R y el historial involucrado. Si está interesado en los antecedentes, recomendaría esta publicación de blog aquí.
Módulo no transitivo
Si el módulo Una especie de Dependiendo de Segundo con Segundo Dependiendo de C¿Cómo citamos los recursos? vamos a ver:
Módulo Una especie de Puede hacer referencia a sus propios recursos (como de costumbre):
R.string.hello_world
Módulo Una especie de Puede referirse al módulo Segundo Recursos (paquetes totalmente calificados):
com.my.moduleB.R.string.hello_neighbour
Módulo Una especie de No se puede hacer referencia al módulo CH.
Puede combinar clases R no transitivas con el complemento Gradle de Android (> 4.2) para crear compilaciones más rápidas para aplicaciones con varios módulos. … Esto traerá compilaciones más recientes y los correspondientes beneficios de evitar la compilación.
https://developer.android.com/studio/releases#refactor-nontransitive-rclasses
¿Cuáles son los beneficios de las clases R no transitivas?
- Reducción del tamaño de AAB / APK, que incluye Recuento de referencias de campo DEX
- Reducir la velocidad de compilación incremental porque se pueden incluir menos dependencias al realizar cambios
- La modularidad aumenta y las dependencias se vuelven más explícitas
- Reducir la complejidad, los recursos no pueden provenir de dependencias transitivas
- Reducir la duración de la compilación completa porque contiene menos código
¡vamos a hacerlo!
Puede editar su /gradle.properties
Archivos para incluir:
android.nonTransitiveRClass=true
Puede que hayas leído android.namespacedRClass
En el pasado. Tenga en cuenta que agosto de 2020; android.namespacedRClass
La propiedad fue renombrada android.nonTransitiveRClass
.como muestra la imagen.
o
Puede usar Android Studio para refactorizar automáticamente, lo que abrirá la configuración anterior y buscará su módulo, tratando de calificar completamente cualquier referencia R que encuentre.
Tenga en cuenta que esta refactorización se agregó en Android Studio Arctic Fox | 2020.3.1 «Refactorización automática de archivos R no transitivos». como muestra la imagen.
Esta refactorización automática no es una panacea, puede causar algunos errores de referencia de recursos, es decir, agregará el nombre de paquete incorrecto antes de la clase R, o no podrá elegir uno en absoluto, o agregará un módulo que no tienes dependencias. Según mi experiencia, estos problemas se descubrieron durante la compilación. Puede elegir entre los siguientes tres pasos de solución para completar el inicio de la herramienta de refactorización:
Cuando haya terminado, tendrá que construir el proyecto y corregir los errores. El error puede tener varios formatos:
- Utiliza recursos de otro módulo.
Hacer fijo: Agregue paquetes completamente calificados, o importe archivos R, o (solo Kotlin) use alias.// Fully qualifed package
val foo = com.my.moduleB.R.string.hello_neighbour
// Import then use string.hello_neighbour
import com.my.moduleB.R
// Alias then use RB.string.hello_neighbour
import com.my.moduleB.R as RB - Utiliza recursos de otro módulo, pero no ha declarado como dependencia de ese módulo.
Hacer fijo: Haz el n. ° 1, pero también agrega dependencias en gradle.implementation project(":libraries:moduleB")
- Utiliza un recurso de otro módulo, pero no declaró una dependencia en ese módulo y no desea declarar una dependencia.
Hacer fijo: La solución aquí es generar una referencia y usar el mismo nombre o copiar / crear el nuevo recurso que desee.
En conclusión
Eso es todo, es fácil para mí decirlo, pero en la práctica, dependiendo del tamaño del proyecto, es posible que deba depurar / buscar la fuente del recurso con muchas horas de anticipación y el nombre correcto del paquete completo que se utilizará.Te recomiendo encarecidamente que abras cualquier proyecto nuevo. nonTransitiveRClass
Antes tienes que lidiar con las consecuencias posteriores.