Android Runtime (ART) incluye un compilador justo a tiempo (JIT) con generación de perfiles de código que mejora de forma continua el rendimiento de las aplicaciones para Android mientras se ejecutan. El compilador JIT complementa el compilador Ahead of Time (AOT) actual de ART y mejora el rendimiento del tiempo de ejecución, ahorra espacio de almacenamiento y acelera las actualizaciones de las aplicaciones y del sistema. También mejora el compilador AOT, ya que evita la ralentización del sistema durante las actualizaciones automáticas de aplicaciones o la recompilación de aplicaciones durante las actualizaciones inalámbricas (OTA).
Aunque JIT y AOT usan el mismo compilador con un conjunto similar de optimizaciones, es posible que el código generado no sea idéntico. El JIT usa información del tipo de tiempo de ejecución, puede realizar una mejor intercalación y permite la compilación de reemplazo en la pila (OSR), todo lo cual genera un código ligeramente diferente.
Arquitectura de JIT
Compilación JIT
La compilación JIT implica las siguientes actividades:
- El usuario ejecuta la app, que luego activa ART para cargar el archivo
.dex
.- Si el archivo
.oat
(el binario de AOT para el archivo.dex
) está disponible, ART lo usa directamente. Aunque los archivos.oat
se generan con regularidad, no siempre contienen código compilado (binario AOT). - Si el archivo
.oat
no contiene código compilado, ART se ejecuta a través de JIT y el intérprete para ejecutar el archivo.dex
.
- Si el archivo
- JIT está habilitado para cualquier aplicación que no se compile según el filtro de compilación
speed
(que dice "compila todo lo que puedas desde la app"). - Los datos del perfil de JIT se vuelcan en un archivo en un directorio del sistema al que solo puede acceder la aplicación.
- El daemon de compilación de AOT (
dex2oat
) analiza ese archivo para impulsar su compilación.
Figura 3: Actividades de daemon JIT.
El servicio de Google Play es un ejemplo que usan otras aplicaciones que se comportan de manera similar a las bibliotecas compartidas.
Flujo de trabajo de JIT
- La información de generación de perfiles se almacena en la caché de código y se somete a la recolección de basura cuando hay presión de memoria.
- No hay garantía de que una instantánea tomada cuando la aplicación estaba en segundo plano contenga datos completos (es decir, todo lo que se JIT).
- No se intenta garantizar que todo se registre (ya que esto puede afectar el rendimiento del tiempo de ejecución).
- Los métodos pueden estar en tres estados diferentes:
- interpretado (código dex)
- Compilación JIT
- Compilación AOT
- El requisito de memoria para ejecutar JIT sin afectar el rendimiento de la app en primer plano depende de la app en cuestión. Las apps grandes requieren más memoria que las pequeñas. En general, las apps grandes se estabilizan alrededor de los 4 MB.
Cómo activar el registro de JIT
Para activar el registro de JIT, ejecuta los siguientes comandos:
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
Inhabilitar JIT
Para inhabilitar JIT, ejecuta los siguientes comandos:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
Cómo forzar la compilación
Para forzar la compilación, ejecuta lo siguiente:
adb shell cmd package compile
Casos de uso comunes para forzar la compilación de un paquete específico:
- Basado en el perfil:
adb shell cmd package compile -m speed-profile -f my-package
- Completa:
adb shell cmd package compile -m speed -f my-package
Casos de uso comunes para forzar la compilación de todos los paquetes:
- Basado en el perfil:
adb shell cmd package compile -m speed-profile -f -a
- Completa:
adb shell cmd package compile -m speed -f -a
Borra los datos del perfil
En Android 13 o versiones anteriores
Para borrar los datos del perfil local y quitar el código compilado, ejecuta lo siguiente:
adb shell pm compile --reset
En Android 14 o versiones posteriores
Para borrar solo los datos del perfil local, haz lo siguiente:
adb shell pm art clear-app-profiles
Nota: A diferencia del comando para Android 13 o versiones anteriores, este comando no borra los datos de perfil externos (".dm") que se instalan con la app.
Para borrar los datos del perfil local y quitar el código compilado generado a partir de los datos del perfil local (es decir, para restablecer el estado de instalación), ejecuta lo siguiente:
adb shell pm compile --reset
Nota: Este comando no quita el código compilado generado a partir de datos de perfil externos (`.dm`) que se instalan con la app.
Para borrar todo el código compilado, ejecuta este comando:
adb shell cmd package compile -m verify -f
Nota: Este comando conserva los datos del perfil local.