User Tools

Site Tools


zh_cn:tutorial:mappings

映射

介绍

映射定义类,字段和方法的名称。 在普通的织机环境中,使用Yarn映射,该映射为社区确定的Minecraft代码库提供了有意义的名称。 Intermediary也是Fabric使用的基本映射类型。 对映射的需求来自对Minecraft版本的混淆,这带来了许多挑战。 重新映射是将映射应用于已编译的类或源文件的过程。

使用映射

在Loom中,映射定义了开发环境中使用的Minecraft类,字段和方法的名称。 根据安装的映射,这些名称可能因开发环境而异。

毛线是Loom使用的默认映射。 随着贡献的增加,纱线会逐渐改进并获得新的版本。 使用构建脚本中的“映射”依赖项配置来指定Loom中的映射,并且可以通过更新依赖项来进行更新。 Minecraft以及mod增强的依赖项配置(例如 modCompile )中包含的依赖项均通过映射进行映射。 未在Yarn中映射的类,字段和方法的中间名称为class_1234method_1234field_1234

dependencies {
    [...]
    mappings "net.fabricmc:yarn:${project.yarn_mappings}"
}

通过更改开发环境中的映射,可以预期Minecraft中的类,方法和字段的名称以及所有包含的mod均已更改,并且可能必须更新代码以引用更改后的名称。 此过程可以部分自动化。 您还必须运行genSources以使用更新的映射访问Minecraft源。

Loom的remapJar任务将产生主要的mod工件,它是使用中间名称构建的jar。 此外,如果存在sourcesJar任务,则remapSourcesJar将使用中间名称生成一个源jar。 这些jar可以安装为mod或包含在具有modCompile依赖项配置的开发环境中。 * '-dev'jar(jar任务输出)不使用中介名称,因此没有用。不能将其作为mod安装在开发环境之外,并且只能在 具有匹配映射的开发环境。 应该改用常规jar(remapJar任务输出),并使用经过mod增强的依赖项配置(例如modCompile)将其安装在开发环境中。

  • 纱线名称仅在开发环境中应用。 在开发环境之外,仅存在中间名称,这意味着代码将与您看到和编写的内容完全不匹配。 Loom可以为您透明地处理此过渡,但是在使用反射时要格外小心。

自定义映射

You can use custom tiny mappings for Fabric Loom for your Gradle project setup.

例如,如果您有一个要用于映射的自定义毛线分支,则可以使用 ./gradlew build命令纱,取出 build / libs目录中的jar文件,然后将其移动到 Gradle项目中的映射文件夹。 然后,将映射依赖项更改为:

dependencies {
    mappings fileTree(dir: "mapping", include: "**.jar")
}

您可以将放置映射的目录更改为任何自定义名称。 只需在上面的dir参数中更改名称即可。 请注意,如果映射目录中的映射jar除了其他文件,则Gradle构建将失败!

重新映射

重新映射是将映射应用于代码,从一组名称转换为另一组名称的过程。 Java源代码和已编译Java代码都可以重新映射。 它涉及根据映射更改引用的名称,以及仔细重命名方法以保留替代。 尽管它将影响反射中使用的名称,但它不会更改代码的功能。

微小的重新映射 是可以重新映射已编译Java代码的工具。 它具有命令行界面和可编程界面。 Loom使用Tiny Remapper完成许多任务,Fabric Loader使用Tiny Remapper将Minecraft代码重新映射到中介。 Loom还能够重新映射Java源代码。

混淆和反混淆

Minecraft Java Edition的发行版是混淆的jar文件,这意味着它们是已编译的二进制文件,其中剥离了任何有意义的命名信息,仅保留了裸露的逻辑。 模糊处理的动机是防止反向工程并减小文件大小。 像Minecraft这样的Java程序很容易反编译,但是混淆处理剥夺了很多对修改目的有用的信息。 也许有人会怀疑一开始如何为Minecraft进行开发。

像Yarn这样的映射为开发提供了有意义的名称。 使用映射可以理解Minecraft代码并为其创建mod。 映射可以提供类,字段,方法,参数和局部变量的名称。 显然,这些映射并不完美。 绘制《我的世界》的整个地图需要来自多个贡献者的大量猜测。 映射可能不完整,有时会随着找到更准确的名称而更改。

中间名

Minecraft的混淆特性是,它在Minecraft版本之间并不总是一致的。在Minecraft的一个版本中,一个类可能被称为abc,而在另一个版本中则被称为abd。同样的不一致也适用于字段和方法。不一致会导致Minecraft版本之间的二进制不兼容。

Java代码可以针对一个库版本进行编译,但仍可与另一个版本一起使用,从而使库的两个版本可以二进制兼容。简而言之,如果库公开了至少相同的类,相同的方法和具有相同名称的字段,则将实现二进制兼容性。当使用Minecraft作为mods的库时,由于缺乏二进制兼容性,Minecraft的混淆问题带来了挑战。

中介为Minecraft版本之间的Minecraft内部定义稳定名称。中介名称的目的是始终引用相同的类,字段或方法。与纱线名称不同,中间名称没有意义,而是遵循数字模式,例如class_1234method_1234field_1234

作为稳定的映射,中间名可以使Minecraft二进制兼容多个版本(例如快照版本)!仅对于版本之间未更改的游戏部分,才保证兼容性。当安装在开发环境之外时,Fabric Loader通过在游戏开始之前重新映射Minecraft(和Realms客户端)来为环境提供中间名称。通过查看安装了Fabric Loader的生产环境中的崩溃报告可以观察到此情况,该报告将包含中间名称。用Loom所应用的中间名称编译的Mod与此环境自然兼容。

zh_cn/tutorial/mappings.txt · Last modified: 2019/12/18 11:36 by lightcolour