Learn · concepts
O que é ASM (Bytecode Java)? Explicação da Biblioteca
ASM é uma biblioteca Java para leitura e escrita de bytecode da JVM em tempo de execução. Veja o que ela faz, como funciona e por que os mods do Minecraft dependem dela.
O que é ASM em modding de Minecraft?
ASM é uma biblioteca Java para ler, modificar e escrever bytecode da JVM. Ela funciona em arquivos .class compilados em vez de código-fonte, permitindo inspecionar ou reescrever uma classe sem recompilar. Mods de Minecraft dependem dela porque ela permite corrigir o jogo no momento do carregamento, após o jogo já ter sido compilado.
Por que a correção de bytecode existe
O jogo Minecraft é distribuído como bytecode compilado, não como código-fonte. Isso significa que um autor de mod não pode alterar o código-fonte e recompilar o jogo inteiro: o código-fonte não existe. A única maneira de corrigir código que você não possui é acessar o nível do bytecode, o conjunto de instruções que a Máquina Virtual Java executa. ASM é a ferramenta prática para essa tarefa.
Como o ASM funciona
ASM transforma uma classe compilada em algo que um programa pode editar. Um arquivo .class é apenas bytecode, as instruções que a Máquina Virtual Java executa. ASM analisa esse bytecode, entrega a você os métodos e campos, e permite adicionar, remover ou alterar instruções. Em seguida, ele escreve uma nova classe válida.
Java puro não consegue fazer isso sozinho. O compilador transforma seu código-fonte em bytecode uma vez, e depois disso o bytecode é fixo. ASM acessa o nível do bytecode, que é a camada abaixo do código-fonte que você normalmente escreve.
O padrão Visitor e a API de árvore
ASM lê uma classe com um ClassReader e escreve uma com um ClassWriter. Entre os dois, o seu código visita as partes da classe e decide o que alterar. Existem duas abordagens:
A abordagem do visitor percorre a classe elemento a elemento. É rápida e usa pouca memória porque nunca mantém a classe inteira de uma vez. A abordagem da árvore carrega a classe em objetos que pode percorrer e editar livremente, o que é mais fácil de entender para alterações maiores, mas usa mais memória.
| Abordagem | Como funciona | Melhor para |
|---|---|---|
| API de Visitor | Transmite eventos da classe à medida que são lidos | Edições pequenas e rápidas com pouca memória |
| API de Árvore | Constrói um modelo de objeto editável da classe | Reescreitas maiores ou mais complexas |
Por que os mods de Minecraft usam ASM
Os mods precisam alterar o código do jogo que não escreveram e não podem recompilar. O jogo é enviado como classes compiladas, então a única maneira de entrar é no nível do bytecode, e é isso que o ASM fornece. Um mod pode injetar um hook em um método do jogo, redirecionar uma chamada ou adicionar um campo, tudo no lançamento.
A maioria dos modders não chama o ASM manualmente. Eles usam Mixin, um framework de nível superior que se baseia no ASM e transforma anotações simples em edições de bytecode por baixo. Você escreve uma pequena classe Java descrevendo a alteração e o framework faz o trabalho de baixo nível com o ASM para você. Os mods Fabric, em particular, dependem desta cadeia.
Quando você precisaria tocar no ASM diretamente
Raramente você escreve ASM bruto como autor de mod. Isso aparece quando uma ferramenta precisa de mais controle do que uma anotação pode expressar, como um carregador, um ofuscador ou um patcher que reescreve classes por completo. Para mods do dia a dia, a camada de anotações por cima é suficiente, e é muito menos propensa a erros.
Perguntas Frequentes
Não. Um decompilador converte bytecode de volta para código-fonte legível. ASM funciona diretamente no bytecode e é construído para modificá-lo, não para recuperar código-fonte.
Geralmente não. A maioria dos mods de Fabric usa Mixin, que esconde os detalhes do ASM por trás de anotações. Você só recorre ao ASM bruto quando precisa de controle fino.
Não. ASM é uma biblioteca Java geral utilizada em diversas ferramentas que trabalham com bytecode. A modificação de Minecraft é um uso comum, mas não o único.
Você não pode. O jogo é enviado compilado, não como código-fonte que você pode alterar e reconstruir. Editar bytecode é a forma prática de corrigir código que você não possui.