Jack est la chaîne d'outils de build Android par défaut pour Android 6.0 - 8.1
Jack est une chaîne d'outils Android qui a compilé la source Java en bytecode Android dex. Vous n'avez rien à faire différemment pour utiliser Jack - utilisez simplement vos commandes makefile standard pour compiler l'arborescence ou votre projet. Android 8.1 est la dernière version utilisant Jack.
À propos de Jack
Jack fonctionne comme indiqué sur la figure 1.
Figure 1. Présentation de Jack.
Format de la bibliothèque Jack
Jack possède son propre format de fichier .jack
qui contient le code dex pré-compilé pour la bibliothèque, permettant une compilation plus rapide (pré-dex).
Figure 2. Contenu du fichier de bibliothèque Jack.
Jill
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 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. Ce serveur :
- Apporte une accélération intrinsèque car cela évite de lancer une nouvelle JVM JRE hôte, de charger le code de Jack, d'initialiser Jack et de réchauffer le JIT à chaque compilation. Il offre également de très bons temps de compilation lors de petites compilations (par exemple en mode incrémental).
- 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 aucune 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, timeout, numéro de ports, etc.) peuvent être modifiés en éditant 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=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 maximum de compilations parallèles autorisées.SERVER_TIMEOUT=60
définit le nombre de secondes d'inactivité pendant lesquelles le 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é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.
Dépanner les compilations Jack
Problème | Action |
---|---|
Votre ordinateur ne répond plus pendant la compilation ou vous rencontrez un échec des compilations Jack en cas d'erreur de mémoire insuffisante. | Réduisez le nombre de compilations Jack simultanées en éditant $HOME/.jack et en modifiant SERVER_NB_COMPILE sur une valeur inférieure. |
Les compilations échouent sur 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. Changez de port en éditant $HOME/.jack (variables SERVER_PORT_SERVICE et SERVER_PORT_ADMIN ). Pour débloquer la situation, désactivez le serveur de compilation Jack en éditant $HOME/.jack et en changeant SERVER en false . Malheureusement cela ralentit considérablement votre compilation et peut vous obliger à lancer make -j avec contrôle de charge (option -l de make ). |
La compilation reste bloquée sans aucun progrès | Pour débloquer la situation, tuez le serveur de fond 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 ). |
Trouvez le journal de 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 de pannes reproductibles du Jack, 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 standard pour compiler l'arborescence (ou votre projet) et joindre la sortie et l'erreur standard. Pour supprimer les journaux de build détaillés, exécutez :
unset ANDROID_JACK_EXTRA_ARGS
Limites de la prise
Par défaut, le serveur Jack ne peut être utilisé que par un seul utilisateur sur un ordinateur. Pour prendre en charge des utilisateurs supplémentaires, sélectionnez différents numéros de port 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 vm-tests-tf
. Les outils de manipulation de bytecode (tels que JaCoCo) ne sont pas pris en charge.
Utiliser Jack
Jack prend en charge 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 pré-indexées.
Figure 4. Bibliothèques Jack avec pré-dex.
Jack ne réutilise pas le pré-dex de la bibliothèque si la réduction, l'obscurcissement ou le reconditionnement sont utilisés dans la compilation.
Compilation incrémentielle
La compilation incrémentielle signifie que seuls les composants touchés depuis la dernière compilation (et leurs dépendances) sont recompilés. La compilation incrémentielle peut être nettement 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 réduction, l'obscurcissement, le reconditionnement ou l'héritage multi-dex sont activés). Pour activer les builds incrémentielles, ajoutez la ligne suivante au fichier Android.mk
du projet que vous souhaitez créer de manière incrémentielle :
LOCAL_JACK_ENABLED := incremental
Rétrécissement et obscurcissement
Jack utilise les fichiers de configuration ProGuard pour permettre la réduction et l'obscurcissement.
Les options courantes sont les suivantes :
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(un seul pot de sortie pris en charge) -
-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 ignorées sont les suivantes :
-
-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
Reconditionnement
Jack utilise les fichiers de configuration Jarjar pour effectuer le reconditionnement. Bien que Jack soit compatible avec les types de règles « règle », il n'est pas compatible avec les types de règles « zap » ou « keep ».
Prise en charge multi-index
Jack offre une prise en charge 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 plus de détails, consultez Activer le multidex pour les applications comportant plus de 64 000 méthodes.
,Jack est la chaîne d'outils de build Android par défaut pour Android 6.0 - 8.1
Jack est une chaîne d'outils Android qui a compilé la source Java en bytecode Android dex. Vous n'avez rien à faire différemment pour utiliser Jack - utilisez simplement vos commandes makefile standard pour compiler l'arborescence ou votre projet. Android 8.1 est la dernière version utilisant Jack.
À propos de Jack
Jack fonctionne comme indiqué sur la figure 1.
Figure 1. Présentation de Jack.
Format de la bibliothèque Jack
Jack possède son propre format de fichier .jack
qui contient le code dex pré-compilé pour la bibliothèque, permettant une compilation plus rapide (pré-dex).
Figure 2. Contenu du fichier de bibliothèque Jack.
Jill
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 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. Ce serveur :
- Apporte une accélération intrinsèque car cela évite de lancer une nouvelle JVM JRE hôte, de charger le code de Jack, d'initialiser Jack et de réchauffer le JIT à chaque compilation. Il offre également de très bons temps de compilation lors de petites compilations (par exemple en mode incrémental).
- 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 aucune 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, timeout, numéro de ports, etc.) peuvent être modifiés en éditant 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=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 maximum de compilations parallèles autorisées.SERVER_TIMEOUT=60
définit le nombre de secondes d'inactivité pendant lesquelles le 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é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.
Dépanner les compilations Jack
Problème | Action |
---|---|
Votre ordinateur ne répond plus pendant la compilation ou vous rencontrez un échec des compilations Jack en cas d'erreur de mémoire insuffisante. | Réduisez le nombre de compilations Jack simultanées en éditant $HOME/.jack et en modifiant SERVER_NB_COMPILE sur une valeur inférieure. |
Les compilations échouent sur 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. Changez de port en éditant $HOME/.jack (variables SERVER_PORT_SERVICE et SERVER_PORT_ADMIN ). Pour débloquer la situation, désactivez le serveur de compilation Jack en éditant $HOME/.jack et en changeant SERVER en false . Malheureusement cela ralentit considérablement votre compilation et peut vous obliger à lancer make -j avec contrôle de charge (option -l de make ). |
La compilation reste bloquée sans aucun progrès | Pour débloquer la situation, tuez le serveur de fond 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 ). |
Trouvez le journal de 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 de pannes reproductibles du Jack, 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 standard pour compiler l'arborescence (ou votre projet) et joindre la sortie et l'erreur standard. Pour supprimer les journaux de build détaillés, exécutez :
unset ANDROID_JACK_EXTRA_ARGS
Limites de la prise
Par défaut, le serveur Jack ne peut être utilisé que par un seul utilisateur sur un ordinateur. Pour prendre en charge des utilisateurs supplémentaires, sélectionnez différents numéros de port 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 vm-tests-tf
. Les outils de manipulation de bytecode (tels que JaCoCo) ne sont pas pris en charge.
Utiliser Jack
Jack prend en charge 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 pré-indexées.
Figure 4. Bibliothèques Jack avec pré-dex.
Jack ne réutilise pas le pré-dex de la bibliothèque si la réduction, l'obscurcissement ou le reconditionnement sont utilisés dans la compilation.
Compilation incrémentielle
La compilation incrémentielle signifie que seuls les composants touchés depuis la dernière compilation (et leurs dépendances) sont recompilés. La compilation incrémentielle peut être nettement 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 réduction, l'obscurcissement, le reconditionnement ou l'héritage multi-dex sont activés). Pour activer les builds incrémentielles, ajoutez la ligne suivante au fichier Android.mk
du projet que vous souhaitez créer de manière incrémentielle :
LOCAL_JACK_ENABLED := incremental
Rétrécissement et obscurcissement
Jack utilise les fichiers de configuration ProGuard pour permettre la réduction et l'obscurcissement.
Les options courantes sont les suivantes :
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(un seul pot de sortie pris en charge) -
-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 ignorées sont les suivantes :
-
-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
Reconditionnement
Jack utilise les fichiers de configuration Jarjar pour effectuer le reconditionnement. Bien que Jack soit compatible avec les types de règles « règle », il n'est pas compatible avec les types de règles « zap » ou « keep ».
Prise en charge multi-index
Jack offre une prise en charge 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 plus de détails, consultez Activer le multidex pour les applications comportant plus de 64 000 méthodes.