Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Compilando con Jack para Android 6.0–8.1

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.

Descripción general de Jack
Figura 1. Descripción general de Jack

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).

Contenido del archivo de la biblioteca Jack
Figura 2. Contenido del archivo de la biblioteca Jack

Jill

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

Importación de bibliotecas .jar con Jill
Figura 3. Flujo de trabajo para importar una biblioteca .jar existente

Servidor 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 configurando SERVER=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.

Bibliotecas Jack con pre-dex
Figura 4. Bibliotecas Jack con pre-dex

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 .