Jack es una cadena de herramientas de Android que compiló la fuente de Java en el código de bytes dex de Android. No tiene que hacer nada diferente para usar Jack, solo use sus comandos de archivo MAKE estándar para compilar el árbol o su proyecto. Android 8.1 es la última versión que usa Jack.
Acerca de Jack
Jack funciona como se muestra en la Figura 1.

Formato de biblioteca Jack
Jack tiene su propio formato de archivo .jack
que contiene el código dex compilado previamente para la biblioteca, lo que permite una compilación más rápida (pre-dex).

Jill
La herramienta Jill traduce las bibliotecas .jar
existentes al nuevo formato de biblioteca, como se muestra a continuación.

.jar
existenteServidor de compilación Jack
La primera vez que se usa Jack, inicia un servidor de compilación local de Jack en su computadora. Este servidor:
- Brinda una aceleración intrínseca porque evita lanzar una nueva JVM JRE de host, cargar el código de Jack, inicializar Jack y calentar el JIT en cada compilación. También proporciona tiempos de compilación muy buenos durante compilaciones pequeñas (por ejemplo, en modo incremental).
- Es una solución a corto plazo para controlar el número de compilaciones paralelas de Jack. El servidor evita sobrecargar tu computadora (problema de memoria o disco) porque limita la cantidad de compilaciones paralelas.
El servidor de Jack se apaga después de un tiempo de inactividad sin ninguna compilación. Utiliza dos puertos TCP en la interfaz localhost y no está disponible externamente. Todos los parámetros (número de compilaciones paralelas, tiempo de espera, número de puertos, etc.) se pueden modificar editando el archivo $HOME/.jack
.
archivo $HOME/.jack
El archivo $HOME/.jack
contiene la siguiente configuración para las variables del servidor Jack en una sintaxis bash completa:
-
SERVER=true
habilita la función de servidor de Jack. -
SERVER_PORT_SERVICE=8072
establece el número de puerto TCP del servidor para propósitos de compilación. -
SERVER_PORT_ADMIN=8073
establece el número de puerto TCP del servidor para fines administrativos. -
SERVER_COUNT=1
no se utiliza. -
SERVER_NB_COMPILE=4
establece el número máximo de compilaciones paralelas permitidas. -
SERVER_TIMEOUT=60
establece la cantidad de segundos de inactividad que el servidor debe esperar sin ninguna compilación antes de apagarse. -
SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
establece el archivo donde se escriben los registros del servidor. De forma predeterminada, esta variable puede sobrecargarse con una variable de entorno. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
establece el comando predeterminado utilizado para iniciar una JVM en el host. De forma predeterminada, esta variable puede estar sobrecargada por la variable de entorno.
Solución de problemas de compilaciones de Jack
Problema | Acción |
---|---|
Su computadora deja de responder durante la compilación o experimenta fallas en las compilaciones de Jack en el error de falta de memoria | Reduzca la cantidad de compilaciones simultáneas de Jack editando $HOME/.jack y cambiando SERVER_NB_COMPILE a un valor más bajo. |
Las compilaciones están fallando en No se puede iniciar el servidor en segundo plano | La causa más probable es que los puertos TCP ya estén en uso en su computadora. Cambie los puertos editando $HOME/.jack (variables SERVER_PORT_SERVICE y SERVER_PORT_ADMIN ). Para desbloquear la situación, deshabilite el servidor de compilación Jack editando $HOME/.jack y cambiando SERVER a false . Desafortunadamente, esto ralentiza significativamente su compilación y puede obligarlo a make -j con control de carga (opción -l de make ). |
La compilación se atasca sin ningún progreso | Para desbloquear la situación, elimine el servidor de fondo de Jack usando jack-admin kill-server ) y luego elimine los directorios temporales contenidos en jack-$USER de su directorio temporal ( /tmp o $TMPDIR ). |
Encontrar el registro de Jack
Si ejecutó un comando make
con un objetivo dist, el registro de Jack se encuentra en $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
. De lo contrario, puede encontrar el registro ejecutando jack-admin server-log
. En caso de fallas de Jack reproducibles, puede obtener un registro más detallado configurando la siguiente variable:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Use los comandos estándar de archivos MAKE para compilar el árbol (o su proyecto) y adjunte la salida estándar y el error. Para eliminar los registros de compilación detallados, ejecute:
unset ANDROID_JACK_EXTRA_ARGS
limitaciones de jack
- De forma predeterminada, el servidor Jack puede ser utilizado por un solo usuario en una computadora. Para admitir usuarios adicionales, seleccione diferentes números de puerto para cada usuario y ajuste
SERVER_NB_COMPILE
consecuencia. También puede deshabilitar el servidor Jack configurandoSERVER=false
en$HOME/.jack
. - La compilación de CTS es lenta debido a la integración actual
vm-tests-tf
. - Las herramientas de manipulación de código de bytes (como JaCoCo) no son compatibles.
Usando Jack
Jack es compatible con el lenguaje de programación Java 1.7 e integra las funciones adicionales que se describen a continuación.
Pre-dexación
Al generar un archivo de biblioteca Jack, el .dex
de la biblioteca se genera y almacena dentro del archivo de biblioteca .jack
como pre-dex. Al compilar, Jack reutiliza el pre-dex de cada biblioteca. Todas las bibliotecas están previamente dexadas.

Jack no reutiliza la biblioteca pre-dex si se usa la reducción, la ofuscación o el reempaquetado en la compilación.
Compilación incremental
La compilación incremental significa que solo se vuelven a compilar los componentes tocados desde la última compilación (y sus dependencias). La compilación incremental puede ser significativamente más rápida que una compilación completa cuando los cambios se limitan a un conjunto de componentes.
La compilación incremental está deshabilitada de forma predeterminada (y se desactiva automáticamente cuando se habilita la reducción, la ofuscación, el reempaquetado o el legado multi-dex). Para habilitar las compilaciones incrementales, agregue la siguiente línea al archivo Android.mk
del proyecto que desea compilar de forma incremental:
LOCAL_JACK_ENABLED := incremental
Reducción y ofuscación
Jack usa los archivos de configuración de ProGuard para habilitar la reducción y la ofuscación.
Las opciones comunes incluyen lo siguiente:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(solo se admite 1 jar de salida) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Las opciones de reducción incluyen lo siguiente:
-
-dontshrink
Las opciones de ofuscación incluyen lo siguiente:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Las opciones ignoradas incluyen las siguientes:
-
-dontoptimize
(Jack no optimiza) -
-dontpreverify
(Jack no verifica previamente) -
-skipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclassmembers
-
-keepdirectories
-
-target
-
-forceprocessing
-
-printusage
-
-whyareyoukeeping
-
-optimizations
-
-optimizationpasses
-
-assumenosideeffects
-
-allowaccessmodification
-
-mergeinterfacesaggressively
-
-overloadaggressively
-
-microedition
-
-verbose
-
-dontnote
-
-dontwarn
-
-ignorewarnings
-
-printconfiguration
-
-dump
reenvasado
Jack usa archivos de configuración jarjar para hacer el reempaquetado. Si bien Jack es compatible con los tipos de reglas "regla", no es compatible con los tipos de reglas "zap" o "keep".
Soporte Multidex
Jack ofrece soporte multidex nativo y heredado. Debido a que los archivos dex están limitados a métodos de 65 000, las aplicaciones con más de 65 000 métodos deben dividirse en varios archivos dex. Para obtener más detalles, consulte Habilitar multidex para aplicaciones con más de 64 000 métodos .