Learn · concepts

Qu'est-ce que l'ASM (code bytecode Java) ? Explication d'une bibliothèque

ASM est une bibliothèque Java permettant de lire et d'écrire le bytecode JVM au moment de l'exécution. Voici ce qu'elle fait, comment elle fonctionne et pourquoi les mods Minecraft en dépendent.

TRtrolPublished 4 min read

Qu'est-ce qu'ASM dans le modding Minecraft ?

ASM est une bibliothèque Java permettant de lire, de modifier et d'écrire le bytecode JVM. Elle fonctionne sur les fichiers .class compilés plutôt que sur le code source, ce qui lui permet d'inspecter ou de réécrire une classe sans la recompiler. Les mods Minecraft s'appuient sur ASM car ils lui permettent de patcher le jeu au moment du chargement, après que le jeu ait déjà été compilé.

Pourquoi le patching de bytecode existe

Le jeu Minecraft est fourni sous forme de bytecode compilé, et non de source. Cela signifie qu'un auteur de mod ne peut pas modifier la source et recompiler tout le jeu : la source n'existe pas. La seule façon de patcher du code que vous ne possédez pas est de s'immiscer au niveau du bytecode, l'ensemble d'instructions que la Machine Virtuelle Java exécute réellement. ASM est l'outil pratique pour cette tâche.

Comment fonctionne ASM

ASM transforme une classe compilée en quelque chose qu'un programme peut modifier. Un fichier .class n'est que du bytecode, les instructions que la Machine Virtuelle Java exécute. ASM analyse ce bytecode, vous fournit les méthodes et les champs, et vous permet d'ajouter, de supprimer ou de modifier des instructions. Ensuite, il écrit une nouvelle classe valide.

Le Java pur ne peut pas faire cela par lui-même. Le compilateur transforme votre source en bytecode une fois, et après cela, le bytecode est figé. ASM s'immisce au niveau du bytecode, qui est la couche située en dessous de la source que vous écrivez normalement.

Le modèle visiteur et l'API arbre

ASM lit une classe avec un ClassReader et en écrit une autre avec un ClassWriter. Entre les deux, votre code visite les parties de la classe et décide quoi modifier. Il existe deux approches :

L'approche visiteur parcourt la classe élément par élément. Elle est rapide et utilise peu de mémoire car elle ne conserve jamais la classe entière en mémoire. L'approche par arbre charge la classe dans des objets que vous pouvez parcourir et modifier librement, ce qui est plus facile à appréhender pour des modifications importantes, mais utilise plus de mémoire.

ApprocheFonctionnementIdéale pour
API VisiteurTransmet les événements de la classe au fur et à mesure de leur lecturePetites modifications rapides avec une faible consommation de mémoire
API ArbreConstruit un modèle d'objet modifiable de la classeRéécritures plus importantes ou plus complexes

Pourquoi les mods Minecraft utilisent ASM

Les mods doivent modifier le code du jeu qu'ils n'ont pas écrit et qu'ils ne peuvent pas recompiler. Le jeu est fourni sous forme de classes compilées, donc le seul moyen d'y accéder est au niveau du bytecode, et c'est ce qu'ASM fournit. Un mod peut injecter un crochet dans une méthode du jeu, rediriger un appel ou ajouter un champ, le tout au lancement.

La plupart des moddeurs n'appellent pas ASM directement. Ils utilisent Mixin, un framework de plus haut niveau qui se base sur ASM et transforme de simples annotations en modifications du bytecode. Vous écrivez une petite classe Java décrivant la modification, et le framework effectue le travail de bas niveau avec ASM pour vous. Les mods Fabric en particulier s'appuient sur cette chaîne.

Quand vous devez manipuler l'ASM directement

En tant qu'auteur de mods, vous écrivez rarement de l'ASM brut. Cela se produit lorsque l'outil a besoin de plus de contrôle que ce qu'une annotation peut exprimer, comme un chargeur, un obfuscateur ou un patcher qui réécrit entièrement des classes. Pour les mods courants, la couche d'annotation est suffisante, et elle est beaucoup moins sujette aux erreurs.

FAQ