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 compile le code source Java en bytecode DEX Android. Pour utiliser Jack, vous n'avez rien à faire. Il vous suffit d'utiliser vos commandes makefile standards pour compiler l'arborescence ou votre projet. Android 8.1 est la dernière version à utiliser Jack.
À propos de Jack
Jack fonctionne comme illustré dans la figure 1.
Figure 1 : Présentation de Jack.
Format de la bibliothèque Jack
Jack dispose de son propre format de fichier .jack
qui contient le code dex précompilé pour la bibliothèque, ce qui permet une compilation plus rapide (pré-dex).
Figure 2. Contenu du fichier de bibliothèque Jack.
Julie
Comme le montre la figure suivante, l'outil Jill traduit les bibliothèques .jar
existantes dans le nouveau format de bibliothèque.
Figure 3. Workflow permettant d'importer une bibliothèque .jar
existante.
Serveur de compilation Jack
La première fois que vous utilisez Jack, il lance un serveur de compilation Jack local sur votre ordinateur. Ce serveur :
- Fournit une accélération intrinsèque, car cela évite de lancer une nouvelle JVM hôte, de charger le code Jack, d'initialiser Jack et de préparer le JIT à chaque compilation. Il fournit également de très bons temps de compilation pour les petites compilations (par exemple, en mode incrémentiel).
- Il s'agit d'une solution à court terme pour contrôler le nombre de compilations Jack parallèles. Le serveur évite de surcharger votre ordinateur (problème de mémoire ou de disque) en limitant le nombre de compilations parallèles.
Le serveur Jack s'arrête après un temps d'inactivité sans aucune compilation.
Il utilise deux ports TCP sur l'interface localhost et n'est pas disponible en externe. Vous pouvez modifier tous les paramètres (nombre de compilations parallèles, délai avant expiration, numéro de port, etc.) en modifiant le fichier $HOME/.jack
.
Fichier $HOME/.jack
Le fichier $HOME/.jack
contient les paramètres suivants pour les variables de serveur Jack dans une syntaxe bash complète:
SERVER=true
active la fonctionnalité de 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 administratives.SERVER_COUNT=1
n'est pas utilisé.SERVER_NB_COMPILE=4
définit le nombre maximal de compilations parallèles autorisées.SERVER_TIMEOUT=60
définit le nombre de secondes d'inactivité que le serveur doit attendre sans 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ée par une variable d'environnement.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
définit la commande par défaut utilisée pour lancer une JVM sur l'hôte. Par défaut, cette variable peut être surchargée par une variable d'environnement.
Résoudre les problèmes de compilation Jack
Problème | Action |
---|---|
Votre ordinateur ne répond plus lors de la compilation, ou vous constatez que les compilations Jack échouent en raison d'une erreur de mémoire insuffisante. | Réduisez le nombre de compilations Jack simultanées en modifiant $HOME/.jack et en remplaçant SERVER_NB_COMPILE par 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. Modifiez les ports en modifiant $HOME/.jack (variables 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 remplaçant SERVER par false . Malheureusement, cela ralentit considérablement votre compilation et peut vous obliger à lancer make -j avec le contrôle de chargement (option -l sur make ). |
La compilation reste bloquée sans progresser | Pour débloquer la situation, arrêtez le serveur en arrière-plan Jack à l'aide de jack-admin kill-server , puis supprimez les répertoires temporaires contenus 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 se trouve dans $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
.
Sinon, vous pouvez trouver le journal en exécutant jack-admin server-log
.
En cas d'échecs Jack reproductibles, vous pouvez obtenir un journal plus détaillé 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 ne peut être utilisé que par un seul utilisateur sur un ordinateur. Pour accepter des utilisateurs supplémentaires, sélectionnez des numéros de port différents pour chaque utilisateur et ajustez SERVER_NB_COMPILE
en conséquence. Vous pouvez également désactiver le 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 du code octet (tels que JaCoCo) ne sont pas acceptés.
Utiliser Jack
Jack est compatible avec le langage de programmation Java 1.7 et intègre les fonctionnalités supplémentaires décrites ci-dessous.
Pré-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 pré-dex.
Lors de la compilation, Jack réutilise le pré-dex de chaque bibliothèque. Toutes les bibliothèques sont converties au format .dex.
Figure 4. Bibliothèques Jack avec format pre-dex.
Jack ne réutilise pas la pré-compilation de la bibliothèque si le rétrécissement, l'obscurcissement ou le reconditionnement sont utilisés lors de 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és. La compilation incrémentielle peut être beaucoup plus rapide qu'une compilation complète lorsque les modifications sont limitées à un ensemble de composants.
La compilation incrémentielle est désactivée par défaut (et est automatiquement désactivée lorsque la minification, l'obscurcissement, le repackaging ou l'ancien format multidex sont activés). Pour activer les compilations incrémentielles, ajoutez la ligne suivante au fichier Android.mk
du projet que vous souhaitez compiler de manière incrémentielle:
LOCAL_JACK_ENABLED := incremental
Minification et obscurcissement
Jack utilise des fichiers de configuration ProGuard pour permettre la minification et l'obscurcissement.
Voici quelques-unes des options courantes :
@
-include
-basedirectory
-injars
-outjars
(un seul fichier JAR de sortie accepté)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Voici les différentes options de réduction :
-dontshrink
Les options d'obscurcissement sont les suivantes:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Les options ignorées sont les suivantes :
-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
Reconditionnement
Jack utilise des fichiers de configuration JAR pour le repackaging. Bien que Jack soit compatible avec les types de règles "rule", il ne l'est pas avec les types de règles "zap" ou "keep".
Compatibilité multidex
Jack propose une prise en charge intégrée et ancienne de la multidex. Les fichiers dex étant 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.