Hola, me llamo Miguel y en esta ocasión les traigo un tutorial.
Introducción
- Agregar métodos (Android Studio 4.1)
- Adicionar archivos de recursos (Android Studio 4.2)
- Agregar campos estáticos (Android Studio 4.2)
Esto le permite reducir el tiempo de respuesta durante el desarrollo y maximizar la productividad. En esta publicación, exploraremos cómo implementamos esto en Android Studio.
Implementación de Android Studio
Apply Changes ha sido diseñado desde cero para evolucionar continuamente con cada nueva iteración de Android Runtime mediante la utilización automática de nuevas funciones y capacidades.
En el caso de la redefinición de clases estructurales, las clases con métodos agregados se envían a ART de manera similar a la versión anterior de Android. Se ha agregado un nuevo punto de entrada de API, por lo que deberá actualizar su Android Studio a la versión 4.1 o posterior para aprovechar la adición de métodos, tanto estáticos como virtuales, sobre la marcha.
Sin embargo, agregar variables requiere un nuevo análisis realizado en Android Studio. Cuando se agrega una nueva variable, ART no intenta determinar qué valor se le debe asignar. (Estén atentos para un futuro blog de ManualesTutor sobre los detalles de implementación de ART de la redefinición de clases estructurales). En cambio, las variables agregadas solo se inicializarán como el valor primitivo predeterminado o nulo y dependerá de Android Studio determinar cómo debe inicializarse.
Este proceso no es trivial. Considere el caso en el que agrega una y larga estática a una clase ‒ la asignación inicial ocurre durante la carga de la clase. Considera esto:
public class example { public final static long x = System.currentTimeMillis(); public final static long y = System.currentTimeMillis();}
Si se carga esta clase, ambos x
y y
deben tener valores muy cercanos entre sí. En el caso donde y
se agrega como una invocación de Aplicar cambios de código, el valor correcto de y
no es fácilmente computable. De hecho, ¿cuál es el valor de y
debe asignarse a es discutible para que imite más de cerca el programa donde y
se inicializa donde se carga la clase. Ya que ambos currentTimeMillis()
fueron invocados durante la inicialización estática (<clinit>
método), Apply Changes continuará siendo fiel a la política de no volver a ejecutar ninguna parte del <clinit>
método. Por tanto, el valor añadido y obtendrá el valor 0.
Afortunadamente, Apply Changes ya usa D8 para el análisis de archivos DEX y, como parte de ese proceso, en la última versión de Android Studio, Apply Changes puede aprovechar la nueva versión de D8. Inspector API. Esta API de inspección liviana puede calcular información adicional como parte del proceso de comparación DEX con muy poca sobrecarga agregada (solo se inspeccionan las clases Java modificadas). Un conjunto de meta información sobre las variables recién agregadas se adjunta a la solicitud de Aplicar cambios ProtoBuf al dispositivo.
En el dispositivo, antes de que Android Studio comunique nuestros cambios a la VM, el agente de Java inspecciona las clases cargadas actuales que están programadas para reemplazo. Al comparar los campos de las clases que pronto serán reemplazadas y las clases recién compiladas, se calcula una lista de los campos que se agregaron recientemente y su valor inicial respectivo. Luego, el agente suspende temporalmente todos los demás subprocesos para evitar que un subproceso acceda a cualquiera de los campos no inicializados recién agregados antes de realizar el intercambio. Si la solicitud de intercambio tiene éxito, entonces inicializará los campos recién agregados con las variables apropiadas.
Limitaciones y próximas funciones
A partir de Android Studio 4.2 Canary 3, esta función solo está disponible para los casos en los que se agrega una nueva primitiva estática. Como subproducto, esto facilita agregar valores en R.class, lo que le da a Apply Changes la capacidad de agregar nuevos recursos.
Una cosa a tener en cuenta que es fiel a todos los usos de Apply Changes: la semántica del programa nunca puede ser la misma que aquella en la que reconstruye y reinicia el programa. Piense en el caso en el que se cambia un constructor; los objetos que se han construido con el antiguo constructor no se reconstruyen. Esto también se aplica a las variables estáticas ya que <clinits>
no se volverá a invocar.
Esperamos que todos puedan aprovechar esta nueva incorporación a Android Studio para mejorar la productividad. Como siempre, invitamos a todos a que nos envíen sus comentarios sobre el uso de Aplicar cambios en nuestro rastreador de problemas y háganos saber qué le gustaría ver mejorado.
Gracias por leer.
Añadir comentario