Jack es la cadena de herramientas de compilación de Android predeterminada para Android 6.0 - 8.1
Jack es una cadena de herramientas de Android que compiló el código fuente de Java en el código de bytes dex de Android. No tiene que hacer nada diferente para usar Jack; simplemente use los comandos estándar de su archivo MAKE para compilar el árbol o su proyecto. Android 8.1 es la última versión que utiliza Jack.
Acerca de Jack
Jack funciona como se muestra en la Figura 1.
Figura 1. Descripción general del gato.
Formato de biblioteca Jack
Jack tiene su propio formato de archivo .jack
que contiene el código dex precompilado para la biblioteca, lo que permite una compilación más rápida (pre-dex).
Figura 2. Contenido del archivo de la biblioteca Jack.
Jill
Como se muestra en la siguiente figura, la herramienta Jill traduce las bibliotecas .jar
existentes al nuevo formato de biblioteca.
Figura 3. Flujo de trabajo para importar una biblioteca .jar
existente.
Servidor de compilación Jack
La primera vez que se utiliza Jack, se inicia un servidor de compilación de Jack local en su computadora. Este servidor:
- Aporta una aceleración intrínseca porque evita iniciar un nuevo host JRE JVM, cargar el código de Jack, inicializar Jack y calentar el JIT en cada compilación. También proporciona muy buenos tiempos de compilación 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 su computadora (problema de memoria o disco) porque limita el número de compilaciones paralelas.
El servidor Jack se apaga solo 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 las siguientes configuraciones 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 fines 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 el número 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 ser sobrecargada por 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 ser sobrecargada por una variable de entorno.
Solucionar 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 debido a un 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 fallan. No se puede iniciar el servidor en segundo plano. | La causa más probable es que los puertos TCP ya estén utilizados en su computadora. Cambie los puertos editando $HOME/.jack (variables SERVER_PORT_SERVICE y SERVER_PORT_ADMIN ). Para desbloquear la situación, desactive el servidor de compilación de Jack editando $HOME/.jack y cambiando SERVER a false . Desafortunadamente, esto ralentiza significativamente tu compilación y puede obligarte a ejecutar 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 en segundo plano de Jack usando jack-admin kill-server ) y luego elimine los directorios temporales contenidos en jack-$USER de su directorio temporal ( /tmp o $TMPDIR ). |
Encuentra 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 reproducibles de Jack, 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"
Utilice comandos de archivo MAKE estándar para compilar el árbol (o su proyecto) y adjuntar la salida estándar y el error. Para eliminar registros de compilación detallados, ejecute:
unset ANDROID_JACK_EXTRA_ARGS
Limitaciones del gato
De forma predeterminada, el servidor Jack solo puede ser utilizado por un usuario en una computadora. Para admitir usuarios adicionales, seleccione diferentes números de puerto para cada usuario y ajuste SERVER_NB_COMPILE
en consecuencia. También puede desactivar el servidor Jack configurando SERVER=false
en $HOME/.jack
. La compilación de CTS es lenta debido a la integración actual vm-tests-tf
. No se admiten herramientas de manipulación de código de bytes (como JaCoCo).
utilizar gato
Jack admite el lenguaje de programación Java 1.7 e integra las funciones adicionales que se describen a continuación.
Pre-dex
Al generar un archivo de biblioteca Jack, el .dex
de la biblioteca se genera y se almacena dentro del archivo de biblioteca .jack
como un pre-dex. Al compilar, Jack reutiliza el pre-dex de cada biblioteca. Todas las bibliotecas están predexadas.
Figura 4. Bibliotecas Jack con pre-dex.
Jack no reutiliza la biblioteca pre-dex si se utiliza reducción, ofuscación o reempaquetado en la compilación.
compilación incremental
La compilación incremental significa que solo se recompilan 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 multidex). Para habilitar compilaciones incrementales, agregue la siguiente línea al archivo Android.mk
del proyecto que desea compilar de forma incremental:
LOCAL_JACK_ENABLED := incremental
Contracción y ofuscación
Jack utiliza archivos de configuración de ProGuard para permitir la reducción y la ofuscación.
Las opciones comunes incluyen las siguientes:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(solo se admite 1 archivo jar de salida) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Las opciones de reducción incluyen las siguientes:
-
-dontshrink
Las opciones de ofuscación incluyen las siguientes:
-
-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 preverifica) -
-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 reempaquetar. 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 integrado 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 64K métodos
,Jack es la cadena de herramientas de compilación de Android predeterminada para Android 6.0 - 8.1
Jack es una cadena de herramientas de Android que compiló el código fuente de Java en el código de bytes dex de Android. No tiene que hacer nada diferente para usar Jack; simplemente use los comandos estándar de su archivo MAKE para compilar el árbol o su proyecto. Android 8.1 es la última versión que utiliza Jack.
Acerca de Jack
Jack funciona como se muestra en la Figura 1.
Figura 1. Descripción general del gato.
Formato de biblioteca Jack
Jack tiene su propio formato de archivo .jack
que contiene el código dex precompilado para la biblioteca, lo que permite una compilación más rápida (pre-dex).
Figura 2. Contenido del archivo de la biblioteca Jack.
Jill
Como se muestra en la siguiente figura, la herramienta Jill traduce las bibliotecas .jar
existentes al nuevo formato de biblioteca.
Figura 3. Flujo de trabajo para importar una biblioteca .jar
existente.
Servidor de compilación Jack
La primera vez que se utiliza Jack, se inicia un servidor de compilación de Jack local en su computadora. Este servidor:
- Aporta una aceleración intrínseca porque evita iniciar un nuevo host JRE JVM, cargar el código de Jack, inicializar Jack y calentar el JIT en cada compilación. También proporciona muy buenos tiempos de compilación 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 su computadora (problema de memoria o disco) porque limita el número de compilaciones paralelas.
El servidor Jack se apaga solo 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 las siguientes configuraciones 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 fines 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 el número 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 ser sobrecargada por 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 ser sobrecargada por una variable de entorno.
Solucionar 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 debido a un 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 fallan. No se puede iniciar el servidor en segundo plano. | La causa más probable es que los puertos TCP ya estén utilizados en su computadora. Cambie los puertos editando $HOME/.jack (variables SERVER_PORT_SERVICE y SERVER_PORT_ADMIN ). Para desbloquear la situación, desactive el servidor de compilación de Jack editando $HOME/.jack y cambiando SERVER a false . Desafortunadamente, esto ralentiza significativamente tu compilación y puede obligarte a ejecutar 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 en segundo plano de Jack usando jack-admin kill-server ) y luego elimine los directorios temporales contenidos en jack-$USER de su directorio temporal ( /tmp o $TMPDIR ). |
Encuentra 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 reproducibles de Jack, 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"
Utilice comandos de archivo MAKE estándar para compilar el árbol (o su proyecto) y adjuntar la salida estándar y el error. Para eliminar registros de compilación detallados, ejecute:
unset ANDROID_JACK_EXTRA_ARGS
Limitaciones del gato
De forma predeterminada, el servidor Jack solo puede ser utilizado por un usuario en una computadora. Para admitir usuarios adicionales, seleccione diferentes números de puerto para cada usuario y ajuste SERVER_NB_COMPILE
en consecuencia. También puede desactivar el servidor Jack configurando SERVER=false
en $HOME/.jack
. La compilación de CTS es lenta debido a la integración actual vm-tests-tf
. No se admiten herramientas de manipulación de código de bytes (como JaCoCo).
utilizar gato
Jack admite el lenguaje de programación Java 1.7 e integra las funciones adicionales que se describen a continuación.
Pre-dex
Al generar un archivo de biblioteca Jack, el .dex
de la biblioteca se genera y se almacena dentro del archivo de biblioteca .jack
como un pre-dex. Al compilar, Jack reutiliza el pre-dex de cada biblioteca. Todas las bibliotecas están predexadas.
Figura 4. Bibliotecas Jack con pre-dex.
Jack no reutiliza la biblioteca pre-dex si se utiliza reducción, ofuscación o reempaquetado en la compilación.
compilación incremental
La compilación incremental significa que solo se recompilan 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 multidex). Para habilitar compilaciones incrementales, agregue la siguiente línea al archivo Android.mk
del proyecto que desea compilar de forma incremental:
LOCAL_JACK_ENABLED := incremental
Contracción y ofuscación
Jack utiliza archivos de configuración de ProGuard para permitir la reducción y la ofuscación.
Las opciones comunes incluyen las siguientes:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(solo se admite 1 archivo jar de salida) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Las opciones de reducción incluyen las siguientes:
-
-dontshrink
Las opciones de ofuscación incluyen las siguientes:
-
-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 preverifica) -
-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 reempaquetar. 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 integrado 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 64K métodos