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.
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.
| Approche | Fonctionnement | Idéale pour |
|---|---|---|
| API Visiteur | Transmet les événements de la classe au fur et à mesure de leur lecture | Petites modifications rapides avec une faible consommation de mémoire |
| API Arbre | Construit un modèle d'objet modifiable de la classe | Réé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
Non. Un décompilateur transforme le bytecode en code source lisible. L'assembleur travaille directement sur le bytecode et est conçu pour le modifier, pas pour récupérer du code source.
Généralement non. La plupart des mods Fabric utilisent Mixin, qui masque les détails ASM derrière des annotations. On n'a recours à l'ASM brut que lorsqu'on a besoin d'un contrôle précis.
Non. ASM est une bibliothèque Java générale utilisée dans de nombreux outils qui travaillent avec le bytecode. La modification de Minecraft est une utilisation courante, mais pas la seule.
Vous ne pouvez pas. Le jeu est distribué sous forme de fichiers compilés, et non sous forme de code source que vous pourriez modifier et reconstruire. Modifier le bytecode est la méthode pratique pour corriger des programmes dont vous n’êtes pas propriétaire.