- ASM — это Java-библиотека для чтения, изменения и записи байт-кода JVM.
- Она работает с откомпилированными .class файлами, поэтому позволяет переписать класс без перекомпиляции.
- Моды используют её для патчинга уже скомпилированной игры во время загрузки.
- Большинство моддеров используют Mixin, который располагается поверх ASM и скрывает детали.
ASM — это Java-библиотека для чтения, изменения и записи байт-кода JVM. Она работает с откомпилированными файлами .class вместо исходного кода, поэтому может проверять или переписывать класс без перекомпиляции. Модификации Minecraft часто используют её, поскольку она позволяет изменять игру во время загрузки, после того как она уже скомпилирована.
Где используется Opal
Opal — это мод для Fabric, а моды Fabric проникают в код игры через этот уровень байт-кода. Вам не нужно работать с ним напрямую: скриптовый движок предоставляет вам удобный способ расширения Opal без написания байт-кода.
Что на самом деле делает ASM
ASM преобразует скомпилированный класс в нечто, что может редактировать программа. Файл .class — это всего лишь байт-код, инструкции, которые выполняет виртуальная машина Java. ASM разбирает этот байт-код, предоставляет вам методы и поля, и позволяет добавлять, удалять или изменять инструкции. Затем он записывает новый, корректный класс.
Обычный Java не может сделать это самостоятельно. Компилятор преобразует ваш исходный код в байт-код один раз, и после этого байт-код фиксируется. ASM проникает на уровне байт-кода, который является уровнем ниже того, что вы обычно пишете
Как это работает
ASM читает класс с помощью ClassReader и записывает класс с помощью ClassWriter. Между этими двумя этапами ваш код посещает части класса и решает, что изменить. Существует два способа сделать это.
Подход с посетителем обрабатывает класс последовательно, элемент за элементом. Он быстрый и использует мало памяти, поскольку никогда не хранит весь класс целиком. Подход с деревом загружает класс в объекты, по которым можно свободно перемещаться и редактировать, что упрощает рассуждения при внесении больших изменений, но требует больше памяти.
| Подход | Как работает | Лучше всего подходит для |
|---|---|---|
| API посетителя | Потоковая передача событий класса по мере их чтения | Небольшие, быстрые изменения с низким потреблением памяти |
| API дерева | Создает редактируемую объектную модель класса | Большие или сложные переписывания |
Почему моды для Minecraft это используют
Модам необходимо изменять код игры, который они не писали и не могут перекомпилировать. Игра распространяется в виде скомпилированных классов, поэтому единственный способ проникновения — на уровне байт-кода, и именно это предоставляет ASM. Мод может внедрить перехватчик в метод игры, перенаправить вызов или добавить поле, всё это при запуске.
Большинство моддеров не вызывают ASM напрямую. Они используют Mixin, высокоуровневый фреймворк, который располагается поверх ASM и преобразует простые аннотации в изменения байт-кода. Вы пишете небольшой Java-класс, описывающий изменение, а фреймворк выполняет низкоуровневую работу с ASM за вас. Моды Fabric в особенности полагаются на эту цепочку.
Когда вам может потребоваться прямой доступ к ASM
Вы редко пишете "сырой" ASM как автор мода. Это возникает, когда инструменту требуется больше контроля, чем может предоставить аннотация, например, загрузчику, обфускатору или патчеру, который переписывает классы целиком. Для обычных модов аннотационного слоя поверх достаточно, и он гораздо менее подвержен ошибкам.
Часто задаваемые вопросы
Нет. Декомпилятор преобразует байткод обратно в читаемый исходный код. ASM работает непосредственно с байткодом и предназначен для его изменения, а не для восстановления исходного кода.
Обычно нет. Большинство модов Fabric используют Mixin, который скрывает детали ASM за аннотациями. К использованию "сырого" ASM прибегают только тогда, когда требуется тонкий контроль.
Нет. ASM — это общая Java-библиотека, используемая во многих инструментах, работающих с байт-кодом. Моддинг Minecraft — одно из распространенных применений, но не единственное.
Вы не можете. Игра распространяется в скомпилированном виде, а не в виде исходного кода, который можно изменить и пересобрать. Редактирование байт-кода — это практичный способ исправления кода, которым вы не владеете.