Я работаю с ForgeGradle (платформа для моддинга Minecraft Forge).
Я хотел бы запутать свой мод перед публикацией, но природа платформы Forge не позволяет мне сделать это, просто запустив программу, такую как ProGuard, после компиляции (с определенными библиотеками).
Почему? Структура выглядит следующим образом: Mod -> Forge -> Minecraft.
Поскольку Minecraft использует свои собственные запутанные классы, а компилятор ForgeGradle НЕ НАПРЯМУЮ запутывает код мода, чтобы он соответствовал коду Minecraft, невозможно использовать MC.jar в качестве библиотеки при использовании ProGuard. Скомпилированный Forge Mod фактически декодируется Forge во время выполнения с использованием имен SRG. Логику этого нелегко объяснить, поэтому я просто отмечу: я не могу запутать .jar таким образом, чтобы он соответствовал библиотекам.
Так что я мог бы просто взять код моего мода (файлы .java) и переименовать все поля/методы/классы, которые являются МОИМИ до компиляции Forge. Есть ли программное обеспечение, которое позволило бы мне выбрать количество файлов .java и «запутать» их таким образом, чтобы не переименовывать ссылки, которые им не принадлежат?
EDIT (больше пояснений):
Код мода имеет 3 состояния: Разработка, Скомпилировано, Выполняется.
Попробую привести пример: Допустим внутри Minecraft.jar есть декомпилированный метод ItemSword.onHit() И его скомпилированная (обфусцированная) версия выглядит так: bca.aa(), также все пакеты потеряны (сплющены).
В состоянии разработки кода мода (.java), чтобы сослаться на него, мы просто делаем: ItemSword.onHit()
Когда мы скомпилируем мод, вызов будет выглядеть так (.class): ItemSword.func_ab4234() — это SRG, о которой я говорил.
Теперь, когда мод будет загружен в игру, forge будет переводить «ItemSword» в «bca» и «func_ab4234()» в «aa()».
Из-за этого я даже не могу добавить нужную библиотеку - НИ ОДНОЙ. Я всегда буду получать (в ProGuard) предупреждение NoClassDefFound, и я не могу его игнорировать (это приведет к сбою компиляции).
Итак, после этого редактирования - возможно ли сделать обфускацию с помощью ProGuard (учитывая, что мне не может быть назначена «хорошая» библиотека)?
2 ответа
Вы пробовали варианты proguard? http://proguard.sourceforge.net/manual/usage.html
Например для сериализуемых классов и других вещей поместите это в свою конфигурацию proguard (вы также можете сохранить полные классы, если хотите):
<!-- With this code serializable classes will be backward compatible -->
<keepnames implements="java.io.Serializable"/>
<!-- or for native access:-->
<keepclasseswithmembernames>
<method access="native"/>
</keepclasseswithmembernames>
<!--Preserve all public classes, and their public and protected fields and methods.-->
<keep access="public">
<field access="public protected"/>
<method access="public protected"/>
</keep>
Если я получил ваш вопрос, вы хотите запутать свой собственный код, а не что-то еще. Это то, в чем ProGuard действительно хорош. Предположим, вы создали свои классы в пакетах com.foo
и com.bar
. Вы можете использовать эту простую команду ProGuard только для запутывания ваших собственных классов:
-keep class !com.foo.**,!com.bar.** { *; }
Он указывает ProGuard не запутывать членов классов, которые не принадлежат ни к com.foo
, ни к com.bar
.
Если вы получаете ошибки NoClassDef
, вы добавили не ту библиотеку. Я предполагаю, что вы используете какую-то IDE (возможно, eclipse). Просмотрите библиотеки, на которые ссылается ваш проект, чтобы найти правильный путь к классам библиотек (например, файл jar). В основном вам нужно найти путь к классам, используемый для компиляции вашего кода, ProGuard также возьмет это, и все должно работать.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.