- ASM to biblioteka Java do odczytu, modyfikacji i zapisu kodu bajtowego JVM.
- Działa na skompilowanych plikach .class, dzięki czemu umożliwia przepisanie klasy bez rekompilacji.
- Modyfikacje (mody) wykorzystują ją do łatania już skompilowanej gry podczas ładowania.
- Większość twórców modyfikacji używa Mixin, który osiada na warstwie nad ASM i ukrywa szczegóły.
ASM to biblioteka Java do odczytu, modyfikacji i zapisu kodu bajtowego JVM. Działa na skompilowanych plikach .class zamiast kodu źródłowego, dzięki czemu może analizować lub przepisywać klasę bez rekompilacji. Modyfikacje Minecrafta często się na niej opierają, ponieważ pozwala im ona na poprawianie gry podczas ładowania, po tym jak gra została już skompilowana.
Gdzie pasuje Opal
Opal to mod dla Fabric, a mody Fabric sięgają do kodu gry poprzez tę warstwę bajtkodu. Nie musisz jej modyfikować bezpośrednio: silnik skryptów oferuje czysty sposób na rozszerzanie Opal bez pisania bajtkodu.
Co tak naprawdę robi ASM
ASM przekształca skompilowaną klasę w coś, czego program może edytować. Plik .class to po prostu bytecode, czyli instrukcje, które wykonuje Java Virtual Machine. ASM analizuje ten bytecode, udostępnia metody i pola, i pozwala na dodawanie, usuwanie lub modyfikowanie instrukcji. Następnie zapisuje nową, poprawną klasę.
Czysta Java nie potrafi tego zrobić samodzielnie. Kompilator zamienia Twój kod źródłowy na bytecode raz, a po tym bytecode jest ustalony. ASM sięga do bytecode na poziomie, który znajduje się poniżej kodu źródłowego, który normalnie piszesz
Jak to działa
ASM odczytuje klasę za pomocą ClassReader i zapisuje ją za pomocą ClassWriter. Pomiędzy tymi dwoma, Twój kod odwiedza części klasy i decyduje, co zmienić. Istnieją dwie możliwości zrobienia tego.
Podejście oparte na visitorze przetwarza klasę element po elemencie. Jest szybkie i zużywa mało pamięci, ponieważ nigdy nie przechowuje całej klasy w całości. Podejście oparte na drzewie ładuje klasę do obiektów, po których można swobodnie poruszać się i je edytować, co jest łatwiejsze do zrozumienia przy większych zmianach, ale zużywa więcej pamięci.
| Podejście | Jak działa | Najlepsze dla |
|---|---|---|
| API Visitora | Przetwarza zdarzenia klasy w trakcie odczytu | Małe, szybkie edycje z małym zużyciem pamięci |
| API Drzewa | Buduje edytowalny model obiektowy klasy | Większe lub bardziej złożone refaktoryzacje |
Dlaczego mody do Minecrafta to wykorzystują
Modyfikatorzy muszą zmieniać kod gry, którego nie napisali i nie mogą ponownie skompilować. Gra jest dostarczana jako skompilowane klasy, więc jedyną drogą jest poziom kodu bajtowego, a ASM to właśnie to zapewnia. Mod może wstrzyknąć hak do metody gry, przekierować wywołanie lub dodać pole, wszystko to podczas uruchamiania.
Większość modderów nie wywołuje ASM bezpośrednio. Używają Mixin, frameworku wyższego poziomu, który opiera się na ASM i zamienia proste adnotacje w edycje kodu bajtowego. Piszesz małą klasę Java opisującą zmianę, a framework wykonuje za Ciebie niskopoziomową pracę z ASM. Mody Fabric w szczególności polegają na tym łańcuchu.
Kiedy musiałbyś dotknąć ASM bezpośrednio
Rzadko piszesz surowy ASM jako autor modyfikacji. Pojawia się on, gdy narzędzie potrzebuje większej kontroli niż może wyrazić adnotacja, na przykład ładowacz, obfuskatór lub patcher, który przepisuje klasy w całości. Dla codziennych modyfikacji warstwy adnotacji na górze wystarczają, i są znacznie mniej podatne na błędy.
FAQ
Nie. Dekompilator przekształca bytecode z powrotem w czytelny kod źródłowy. ASM działa bezpośrednio na bytecode i jest przeznaczone do jego modyfikacji, a nie do odzyskiwania kodu źródłowego.
Zazwyczaj nie. Większość modów Fabric używa Mixin, który ukrywa szczegóły ASM za pomocą adnotacji. Do surowego ASM sięgasz tylko wtedy, gdy potrzebujesz precyzyjnej kontroli.
Nie. ASM to ogólna biblioteka Java, wykorzystywana w wielu narzędziach pracujących z bytecode. Modyfikowanie Minecrafta to jedno z popularnych zastosowań, ale nie jedyne.
Nie można tego zrobić. Gra jest dostarczana w formie skompilowanej, a nie jako kod źródłowy, który można modyfikować i rekompilować. Edycja kodu bajtowego to praktyczny sposób na poprawki kodu, którego nie posiadasz.