Jack était la chaîne d'outils de compilation Android par défaut pour Android 6.0 à 8.1. Elle était utilisée pour compiler la source Java en bytecode dex Android, comme illustré dans la figure 1 :
Figure 1. Présentation de Jack.
Le format de fichier .jack 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.
Outil Jill
L'outil Jill traduit les bibliothèques .jar existantes au nouveau format de bibliothèque .jack, comme illustré dans la figure 3 :
Figure 3. Workflow pour importer 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. qui :
- Apporte une accélération intrinsèque, car il évite de lancer une nouvelle JVM JRE hôte, de charger le code Jack, d'initialiser Jack et de préparer le JIT à chaque compilation. Il offre également de très bons temps de compilation lors de petites compilations (par exemple, en mode incrémentiel).
- Est 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), car il limite le nombre de compilations parallèles.
Le serveur Jack s'arrête après un temps d'inactivité sans compilation. Il utilise deux ports TCP sur l'interface localhost et n'est pas disponible en externe.
Tous les paramètres (tels que le nombre de compilations parallèles, le délai avant expiration et les numéros de port) peuvent être modifiés en modifiant le fichier $HOME/.jack.
Fichier $HOME/.jack
Le fichier $HOME/.jack contient les paramètres suivants pour les variables du serveur Jack dans une syntaxe bash complète :
SERVER=trueactive la fonctionnalité de serveur de Jack.SERVER_PORT_SERVICE=8072définit le numéro de port TCP du serveur à des fins de compilation.SERVER_PORT_ADMIN=8073définit le numéro de port TCP du serveur à des fins d'administration.SERVER_COUNT=1n'est pas utilisé.SERVER_NB_COMPILE=4définit le nombre maximal de compilations parallèles autorisées.SERVER_TIMEOUT=60dé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 pendant la compilation ou vous rencontrez des échecs de compilation Jack 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. |
| Les compilations échouent en raison de l'erreur Impossible de lancer le serveur en arrière-plan | La cause la plus probable est que les 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 charge (option -l de make). |
| La compilation est bloquée sans aucune progression | Pour débloquer la situation, arrêtez le serveur d'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). |
Rechercher le journal Jack
Si vous avez exécuté une commande make avec une cible de distribution, 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 :
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 prendre en charge d'autres utilisateurs, 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 de bytecode (tels que JaCoCo) ne sont pas compatibles.
Utiliser Jack
Jack est compatible avec le langage de programmation Java 1.7 et intègre les fonctionnalités supplémentaires décrites dans cette section. Utilisez les commandes makefile standards pour compiler l'arborescence ou votre projet.
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 pré-dexées.
Figure 4. Bibliothèques Jack avec pré-dex.
Jack ne réutilise pas le pré-dex de la bibliothèque si la minification, l'obscurcissement ou le repackaging sont utilisés 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é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 le multidex hérité sont activés). Pour activer les builds incrémentiels, 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 activer la minification et l'obscurcissement. Voici quelques options courantes :
@-include-basedirectory-injars-outjars(un seul fichier jar de sortie est accepté)-libraryjars-keep-keepclassmembers-keepclasseswithmembers-keepnames-keepclassmembernames-keepclasseswithmembernames-printseeds
Voici les options de minification :
-dontshrink
Voici les options d'obscurcissement :
-dontobfuscate-printmapping-applymapping-obfuscationdictionary-classobfuscationdictionary-packageobfuscationdictionary-useuniqueclassmembernames-dontusemixedcaseclassnames-keeppackagenames-flattenpackagehierarchy-repackageclasses-keepattributes-adaptclassstrings
Voici les options ignorées :
-dontoptimize(Jack n'optimise pas)-dontpreverify(Jack ne prévérifie pas)-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 jarjar pour effectuer le repackaging. Bien que Jack soit compatible avec les types de règles rule, il n'est pas compatible avec les types de règles zap ni keep.
Compatibilité multidex
Jack offre une compatibilité multidex intégrée et héritée. Étant donné que 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.