Tiempo de ejecución de Android y Dalvik

Android Runtime (ART) es el entorno de ejecución administrado que usan las apps y algunos servicios del sistema en Android. ART y su predecesor, Dalvik, se crearon originalmente para el proyecto de Android. ART como entorno de ejecución ejecuta el formato Dalvik Executable (DEX) y la especificación de código de bytes DEX.

ART y Dalvik son entornos de ejecución compatibles que ejecutan el código de bytes DEX, por lo que las apps desarrolladas para Dalvik deberían funcionar cuando se ejecuten con ART. Sin embargo, algunas técnicas que funcionan en Dalvik no funcionan en ART. Para obtener información sobre los problemas más importantes, consulta Cómo verificar el comportamiento de la app en el entorno de ejecución de Android (ART).

Funciones de ART

Estas son algunas de las funciones principales que implementa ART.

compilación por adelantado (AOT);

ART presenta la compilación anticipada (AOT), que puede mejorar el rendimiento de la app. ART también tiene una verificación más estricta del tiempo de instalación que Dalvik.

En el momento de la instalación, ART compila apps con la herramienta dex2oat integrada en el dispositivo. Esta utilidad acepta archivos DEX como entrada y genera una app compilada ejecutable para el dispositivo de destino. La utilidad debería poder compilar todos los archivos DEX válidos sin dificultad. Sin embargo, algunas herramientas de procesamiento posterior producen archivos no válidos que Dalvik puede tolerar, pero que ART no puede compilar. Para obtener más información, consulta Cómo abordar los problemas de recolección de elementos no utilizados.

Recolección de elementos no utilizados mejorada

La recolección de elementos no utilizados (GC) requiere muchos recursos, lo que puede perjudicar el rendimiento de una app, lo que genera una pantalla entrecortada, una respuesta deficiente de la IU y otros problemas. ART mejora la recolección de basura de varias maneras:

  • Diseño principalmente concurrente con una sola pausa de GC
  • Copia simultánea para reducir el uso de memoria en segundo plano y la fragmentación
  • La duración de la pausa de GC es independiente del tamaño del montón.
  • Recolector con un tiempo de GC total más bajo para el caso especial de limpieza de objetos de corta duración asignados recientemente
  • Se mejoró la ergonomía de la recolección de elementos no utilizados, lo que hace que las recolecciones simultáneas de elementos no utilizados sean más oportunas, lo que hace que los eventos GC_FOR_ALLOC sean muy raros en casos de uso típicos.

Mejoras en el desarrollo y la depuración

ART ofrece varias funciones para mejorar el desarrollo y la depuración de apps.

Compatibilidad con el generador de perfiles de muestreo

Históricamente, los desarrolladores han usado la herramienta Traceview (diseñado para el seguimiento de la ejecución de la app) como generador de perfiles. Si bien Traceview proporciona información útil, sus resultados en Dalvik se vieron afectados por la sobrecarga por llamada de método, y el uso de la herramienta afecta notablemente el rendimiento del tiempo de ejecución.

ART agrega compatibilidad con un generador de perfiles de muestreo dedicado que no tiene estas limitaciones. Esto proporciona una vista más precisa de la ejecución de la app sin una ralentización significativa. Se agregó compatibilidad con el muestreo a Traceview para Dalvik en la versión de KitKat.

Compatibilidad con más funciones de depuración

ART admite varias opciones de depuración nuevas, en particular en las funciones relacionadas con el monitor y la recolección de elementos no utilizados. Por ejemplo, puedes hacer lo siguiente:

  • Consulta qué bloqueos se mantienen en los seguimientos de pila y, luego, salta al subproceso que mantiene un bloqueo.
  • Pregunta cuántas instancias activas hay de una clase determinada, pide ver las instancias y averigua qué referencias mantienen activo un objeto.
  • Filtrar eventos (como puntos de interrupción) para una instancia específica
  • Consulta el valor que devuelve un método cuando sale (con eventos de "salida del método").
  • Establece un punto de vigilancia de campo para suspender la ejecución de un programa cuando se accede a un campo específico o se modifica.

Se mejoraron los detalles de diagnóstico en las excepciones y los informes de fallas.

ART te brinda todo el contexto y los detalles posibles cuando se producen excepciones de tiempo de ejecución. ART proporciona detalles de excepciones expandidos para java.lang.ClassCastException, java.lang.ClassNotFoundException y java.lang.NullPointerException. (Las versiones posteriores de Dalvik proporcionaron detalles de excepción expandidos para java.lang.ArrayIndexOutOfBoundsException y java.lang.ArrayStoreException, que ahora incluyen el tamaño del array y el desplazamiento fuera de los límites, y ART también lo hace).

Por ejemplo, java.lang.NullPointerException ahora muestra información sobre lo que la app intentaba hacer con el puntero nulo, como el campo al que la app intentaba escribir o el método al que intentaba llamar. Estos son algunos ejemplos típicos:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART también proporciona información de contexto mejorada en los informes de fallas nativas de la app, ya que incluye información de Java y de la pila nativa.

Cómo informar problemas

Si tienes algún problema que no se deba a problemas de JNI de la app, infórmalo a través del seguimiento de errores del proyecto de código abierto de Android. Incluye un adb bugreport y un vínculo a la app en Google Play Store (si está disponible). De lo contrario, si es posible, adjunta un APK que reproduzca el problema.