Compilando con Jack (AOSP 6.0 - 8.1)

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.

Descripción general de Jack.

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

Contenido del archivo de la biblioteca Jack.

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.

Flujo de trabajo para importar una biblioteca `jar.` existente.

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.

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

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

Usando gato

Jack admite el lenguaje de programación Java 1.7 e integra las funciones adicionales que se describen a continuación.

Predexación

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.

Bibliotecas Jack con pre-dex.

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