Иконка ресурса

Обфускация имён в Minecraft

Версия(и) Minecraft
*
Итак, для экономии места, запутывания моддеров, и по прочим причинам, после финальной компиляции игры, её классы обфусцируются.

Как вы скорее всего знаете, обфускация - процесс переименовывания длинных читабельных названий в короткие - виртуальная машина спокойно себе с ними работает, а вот нам мешкам с костями, уже посложнее.

Итак, в игре и в моддинге всего существует три типа именований.
  • Notch names - все те aa, ab, aj, которые вы можете увидеть, если откроете minecraft.jar. К счастью, благодаря MCP и Forge, вы скорее всего никогда в жизни с ними не столкнётесь. Они полностью меняются с каждой версией игры.
  • Searge/SRG names - уже намного более знакомые, func_324e4 и им подобные, это полуобфусцированные сгенерированные имена, они довольно стабильны и почти не меняются через версии. Классы уже имеют читабельное название, а поля-методы - те сгенерированные имена. Я не знаю как там раньше было (MCP, все дела), но сейчас сам Searge работает в Mojang и вроде-бы чуть ли не сам, напрямую и сразу, предоставляет маппинг Notch <-> SRG.
  • И, наконец, MCP names - то, что вы видите у себя в IDE, читабельные имена полей, которыми может пользоваться людишка-программист.

Маппинг - csv файл, описывающий соответствие между какими-либо из вышеописанных трёх множествами имён.
Единственные маппинги, которые нас касаются, это SRG <-> MCP, их постоянно делают и апдейтят чуваки из MCP, ну и добровольцы тоже.

Процесс происходит таким образом.
При запуске игры, фордж сам полностью транслирует все имена из Notch names в SRG, в рантайме.
При компиляции модов, gradle транслирует имена из MCP в SRG.
Итого с одной стороны у нас полностью обфусцированные имена, а с другой - читабельные MCP имена. SRG имена - это связующее звено между ними и в реально запущенной игре применяются именно они.

Так-же есть ещё setupDevWorkspace и setupDecompWorkspace.
Первый - сетапит джарник игры с SRG (ну он вроде-бы готовый скачивается с серверов форджа (но это не точно) и поэтому идёт быстрее), чисто чтобы вы могли запустить игру, а второй - деобфусцирует его(SRG -> MCP), чтобы вы могли видеть "исходник" игры в IDE, с нормальными именами.

Если маппинг не полный (ну почти всегда на что-то, особенно из добавленного в самой последней версии, маппинга таки нету), то вы как раз видите SRG имя.
Кстати, если поняли по коду назначение поля/метода - можете предложить своё название в MCP (<- даже просто так зайдите и посмотрите, сайт небольшой).

Забавно что при запуске из IDE фордж проверяет, была ли деобфускация (то бишь вызвали вы setupDevWorkspace или setupDecompWorkspace), и если не было - в рантайме преобразует имена в MCP, для того чтобы дебаг и стектрейсы выглядели нормально.

В общем вот почему для правильного использования рефлексии приходится изгаляться с ObfuscationReflectionHelper и указывать там оба варианта имён, ибо у вас в дебаге они MCP, а при реальном использовании - SRG.

Немного энциклопедических знаний средней полезности)
Автор
necauqua
Просмотры
2,110
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя necauqua

Сверху