Compiler avec Jack (AOSP 6.0 à 8.1)

Jack est la chaîne d'outils de compilation par défaut d'Android pour Android 6.0 à 8.1.

Jack est une chaîne d'outils Android qui a compilé une source Java en dex Android. du bytecode. Vous n'avez rien à faire différemment pour utiliser Jack. Il vous suffit d'utiliser votre standards makefile pour compiler l'arborescence ou votre projet. Android 8.1 est la dernière version qui utilise Jack.

À propos de Jack

Jack fonctionne comme illustré dans la figure 1.

Présentation de Jack.

Figure 1 : Présentation de Jack.

Format de la bibliothèque Jack

Jack a son propre format de fichier .jack qui contient le code dex précompilé pour la bibliothèque, ce qui accélère la compilation (pré-dex).

Contenu du fichier de la bibliothèque Jack.

Figure 2. Contenu du fichier de la bibliothèque Jack.

Julie

Comme le montre la figure suivante, l'outil Jill traduit le texte existant .jar dans le nouveau format de bibliothèque.

Workflow d'importation d'une bibliothèque "jar." existante.

Figure 3. Workflow d'importation d'une bibliothèque .jar existante.

Serveur de compilation Jack

La première fois que Jack est utilisé, il lance un serveur de compilation Jack local sur votre ordinateur. Ce serveur:

  • apporte une accélération intrinsèque car elle évite de lancer une nouvelle JVM hôte, le chargement du code Jack, l'initialisation de Jack et l'échauffement du JIT à chaque compilation. Elle fournit aussi de très bons temps de compilation (en mode incrémentiel, par exemple).
  • Il s'agit d'une solution à court terme pour contrôler le nombre de requêtes de compilations. Le serveur évite de surcharger votre ordinateur (problème de mémoire ou de disque). car cela limite le nombre de compilations parallèles.

Le serveur Jack s'arrête automatiquement après une période d'inactivité sans compilation. Il utilise deux ports TCP sur l'interface localhost et n'est pas disponible en externe. Tous les paramètres (nombre de compilations parallèles, délai avant expiration, ports) numéro, etc.) en modifiant le fichier $HOME/.jack.

Fichier $HOME/.jack

Le fichier $HOME/.jack contient les paramètres suivants pour Jack variables de serveur dans une syntaxe bash complète:

  • SERVER=true active la fonctionnalité serveur de Jack.
  • SERVER_PORT_SERVICE=8072 définit le numéro de port TCP du serveur. à des fins de compilation.
  • SERVER_PORT_ADMIN=8073 définit le numéro de port TCP du serveur. à des fins d'administration.
  • SERVER_COUNT=1 n'est pas utilisé.
  • SERVER_NB_COMPILE=4 définit le nombre maximal de parallèles autorisées de compilations. SERVER_TIMEOUT=60 définit le nombre de secondes d'inactivité du serveur doit attendre sans aucune compilation avant de s'arrêter. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} définit le fichier dans lequel les journaux du serveur sont écrits. Par défaut, cette variable peut être surchargées par une variable d'environnement.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} définit la valeur par défaut utilisée pour lancer une JVM sur l'hôte. Par défaut, cette variable peut être par une variable d'environnement.

Résoudre les problèmes liés aux compilations Jack

Problème Action
Votre ordinateur ne répond plus pendant la compilation ou vous constatez Échec des compilations Jack en cas d'erreur de mémoire insuffisante Réduire le nombre de jack simultanés compilations en modifiant $HOME/.jack et en changeant SERVER_NB_COMPILE sur une valeur inférieure.
Échec des compilations sur le message Impossible de lancer le serveur en arrière-plan La cause la plus probable est que des ports TCP sont déjà utilisés sur votre ordinateur. Modifier en modifiant $HOME/.jack (SERVER_PORT_SERVICE et SERVER_PORT_ADMIN). Pour débloquer la situation, désactivez le Serveur de compilation Jack en modifiant $HOME/.jack et en changeant SERVER à false. Malheureusement, cela ralentit considérablement votre compilation et peut vous obliger à lancer make -j avec une charge (option -l sur make).
La compilation se bloque sans progression Pour débloquer la situation, arrêtez le serveur d'arrière-plan Jack en utilisant jack-admin kill-server), puis supprimez les répertoires temporaires contenue dans jack-$USER de votre répertoire temporaire (/tmp ou $TMPDIR).

Trouver la bûche Jack

Si vous avez exécuté une commande make avec une cible dist, le journal Jack est situé à l'adresse $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log. Sinon, vous pouvez trouver le journal en exécutant jack-admin server-log. En cas de défaillances reproductibles des connecteurs, vous pouvez obtenir un journal plus détaillé en en définissant la variable suivante:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

Utilisez les commandes makefile standards pour compiler l'arborescence (ou votre projet) et joindre la sortie standard et l'erreur. Pour supprimer les journaux de compilation détaillés, exécutez la commande suivante:

unset ANDROID_JACK_EXTRA_ARGS

Limites de Jack

Par défaut, le serveur Jack peut être utilisé par un seul utilisateur sur un ordinateur. Pour ajouter des utilisateurs, sélectionnez un numéro de port différent pour chaque utilisateur et ajustez SERVER_NB_COMPILE en conséquence. Vous pouvez également désactiver serveur Jack en définissant SERVER=false dans $HOME/.jack. La compilation CTS est lente en raison de l'intégration actuelle de vm-tests-tf. Les outils de manipulation de bytecode (tels que JaCoCo) ne sont pas pris en charge.

Utiliser Jack

Jack est compatible avec le langage de programmation Java 1.7 et intègre les fonctionnalités supplémentaires les fonctionnalités décrites ci-dessous.

Avant-dex

Lors de la génération d'un fichier de bibliothèque Jack, le .dex de la bibliothèque est généré et stocké dans le fichier de bibliothèque .jack en tant que fichier pré-dex. Lors de la compilation, Jack réutilise le pré-dex de chaque bibliothèque. Toutes les bibliothèques sont au format .dex.

Bibliothèques Jack avec format pre-dex.

Figure 4. Bibliothèques Jack avec format pre-dex.

Jack ne réutilise pas le pré-dex de la bibliothèque en cas de minification, d'obscurcissement ou le repackaging est utilisé dans la compilation.

Compilation incrémentielle

La compilation incrémentielle signifie que seuls les composants modifiés depuis la dernière compilation (et leurs dépendances) sont recompilées. La compilation incrémentielle peut soit beaucoup plus rapide qu'une compilation complète lorsque les modifications sont limitées ensemble de composants.

La compilation incrémentielle est désactivée par défaut (et est automatiquement désactivé lors de la minification, de l'obscurcissement, du repackaging ou de l'ancien format multidex est activé). Pour activer les builds incrémentiels, ajoutez la ligne suivante au Android.mk du projet que vous souhaitez compiler de manière incrémentielle:

LOCAL_JACK_ENABLED := incremental

Rétrécissement et obscurcissement

Jack utilise des fichiers de configuration ProGuard pour permettre la minification et l'obscurcissement.

Les options les plus courantes sont les suivantes:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (un seul fichier JAR de sortie accepté)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Les options de réduction sont les suivantes:

  • -dontshrink

Les options d'obscurcissement sont les suivantes:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

Les options suivantes sont ignorées:

  • -dontoptimize (Jack n'optimise pas)
  • -dontpreverify (Jack n'effectue pas de prévalidation)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

Repackaging

Jack utilise des fichiers de configuration JAR pour le repackaging. Alors que Jack compatible avec "règle" les types de règles de pare-feu, il n'est pas compatible avec "zap" ou "garde" de règles de pare-feu.

Compatibilité multidex

Jack offre une prise en charge intégrée et ancienne de multidex. Comme les fichiers dex sont limités à 65 000 méthodes, les applications comportant plus de 65 000 méthodes doivent être divisées en plusieurs fichiers DEX . Pour en savoir plus, consultez Activer multidex pour les applications comportant plus de 64 000 méthodes