Mixin是一个使用 ASM 的 Java 特征/混合框架,并通过一组可插入的内置或用户提供的服务挂钩到运行时类加载过程。内置服务目前支持 Mojang 的 LegacyLauncher 系统,尽管 cpw 已弃用该系统,转而采用 ModLauncher,后者具有更大的可扩展性并支持 Java 8 及更高版本。
文档
Mixin的主要文档可以在 Wiki 中找到。
有关各个功能和注释的其他文档可以在广泛的 Javadoc 中找到。如需更多帮助,请使用 Sponge Discord 服务器上的#mixin
频道。
二进制文件
Mixin 二进制文件可通过 Jenkins 获取,并发布到以下 Maven 存储库:
- https://repo.spongepowered.org/repository/maven-public/ - SNAPHOT 和 RELEASE 构建
- https://files.minecraftforge.net/maven/ - 仅发布版本
工装
为了处理混淆任务,Mixin 提供了一个注释处理器,它在编译时工作,生成混淆映射以供您的工具链应用。如果使用 Gradle 5 或更高版本,注释处理器不再从compile
配置中自动加载,并且必须通过annotationProcessor
配置显式指定。为此,Mixin 通过:processor
分类器提供了包含所有必需依赖项的“fat jar”工件。例如,如果您的构建使用依赖项org.spongepowered:mixin:1.2.3
,那么您的annotationProcessor 配置应指定依赖项org.spongepowered:mixin:1.2.3:processor
。
如果您在 Minecraft Forge 项目中使用 Mixin,则可以使用 MixinGradle 插件来简化 Mixin 注释处理器的配置。它提供了为您的项目配置 Mixin AP 的简单语法,请参阅 MixinGradle README 了解如何配置 MixinGradle。
与 Eclipse 集成
使用Mixin进行开发时,您可以使用 Eclipse 中的Mixin Annotation Processor来提供上下文相关的错误和警告,以帮助您更轻松地对 mixin 进行故障排除。为此:
- 运行
gradle build
命令生成 mixin jar - 打开 Eclipse 项目的属性并导航到
Java Compiler
-> Annotation Processing
-> Factory Path
- 选中
Enable project specific settings
复选框 - 单击
Add External JARs
按钮并选择生成的带有后缀-processor的 mixin jar(提示:它应该位于Mixin/build/libs
中) - 向上导航一级到
Java Compiler
-> Annotation Processing
- 选中
Enable project specific settings
复选框 - 选中
Enable annotation processing
复选框 - 单击
Processor options
框旁边的New...
按钮
- 将
Key
设置为reobfSrgFile - 将
Value
设置为mcp-srg.srg
文件的完全限定路径(映射文件的位置因平台而异,如果您不确定在哪里找到它,请点击下面的不和谐链接)。
- 单击
OK
应用更改
与 IntelliJ IDEA 集成
在 IntelliJ IDEA 中使用Mixin的增强功能可通过 DemonWav 开发的 Minecraft Development for IntelliJ IDEA 插件获得。
版本历史
在配置中指定minVersion
属性非常重要。以下版本历史记录可用于确定何时引入功能(有时何时消除主要错误),以帮助您确定应指定哪个minVersion
。
版本 | 日期 | 特点/变化 |
---|
0.8.3 | 2021 年 2 月 | - 添加了动态目标选择器支持和@Desc目标选择器
- 添加了模式目标选择器
- 为显式目标选择器添加了更具表现力的量词支持
- javadoc 的改版和整体改进
|
0.8.1 (0.8.2) | 2020年9月 | - 支持 ModLauncher 7.0 的修补程序
- 修复了解决继承接口中混淆成员的关键问题
- 更新至 ASM 7.2
|
0.8 | 2020年1月 | - 更新至 ASM 6.2
- 支持 ModLauncher
- 添加了对 Java 9 和 10 的识别
- 支持ForgeGradle 3+ tsrg 混淆表
- 配置现在可以继承其他配置
- @Invoke现在可用于公开构造函数
- 显着改进了意外应用程序和预处理器异常的上下文报告,使得在代理因特定操作码而阻塞时更容易诊断
- 错误修复
- 从 mixin 代码内部调用访问器 mixin 的成员
- 显式目标声明中的空格处理不正确
- 尝试重定向参与者时出现意外行为
- 正确检测不兼容的访问器重叠并忽略有效的访问器重叠(不警告)
- 如果接口在目标类之前被类加载,接口静态访问器现在可以正确地符合目标
- 正确检测和报告访问器的静态不匹配,而不是导致崩溃
- 修复了与需要 DUP2 的堆栈上的双字操作数相关的生成器和注入器错误
- 修复了从 FabricMC 合并的 LVT 生成器中的问题
- 当最终方法被 mixin 意外隐藏时快速失败
- 修复本地捕获注入器 LVT 中杂散CallbackInfo实例的外观
- Apache Commons-IO 依赖项已删除
- 已重命名的阴影 ASM 已删除
- 改进了局部变量捕获注入的局部变量分辨率
- 回调注入器和重定向上的@Coerce现在可以解析超级接口,包括混合接口
|
0.7.11 | 2018年7月 | - 修复了 3 个小错误:修复了 maxShiftBy 的处理、改进了 BeforeInvoke 许可搜索、禁用通用签名合并(除非反编译器处于活动状态)。
|
0.7.10 | 2018年6月 | |
0.7.9 | 2018年4月 | |
0.7.8 | 2018年4月 | - 修复了成员声明验证、非通配符重定向以及Args子类生成器中的内部错误的错误
|
0.7.7 | 2018年3月 | - 修复了使用意外记录器配置运行时处理 INIT 阶段的日志消息触发器和错误的问题
- 在修改常量处理程序中添加无效切片点和缩小转换的警告
|
0.7.6 | 2017年11月 | |
0.7.5 | 2017年10月 | |
0.7.4 | 2017年9月 | - 添加了@Dynamic注释,用于使用动态注入的目标来装饰 mixin 元素。
|
0.7.3 | 2017年8月 | - 内部更改以支持 modlauncher 和 java 9
|
0.7.2 | 2017年8月 | |
0.7.1 | 2017年8月 | - 对 Mixin AP 的修复和改进,修复多维数组的处理以及解析混淆类的派生类型的超类中的方法
- 添加运行时 refmap 重新映射以支持使用具有不同映射版本的 deobfCompile 依赖项。
|
0.7 | 2017年7月 | - 所有官方二进制文件现已签名
- 升级到ASM 5.2
- 在 Mixins 中添加对内部类的支持
- 注入器现在可以有多个显式目标
- @At注释现在可以有自己的id
- 添加对在非混淆方法上使用@Overwrite的支持,作为验证覆盖目标是否存在的一种方式
- 改进对合成桥的支持,检测冲突的桥方法
- 检测并警告 At.Shift.BY 值过高
- ModifyConstant现在可以支持多个切片
- 添加允许喷油器以检测过度喷射
|
0.6.15 | 2017年7月 | - 在ModifyConstant中添加对多个常量的支持
- 添加CONSTANT作为通用注入点
- 添加对在字段重定向器中重定向数组长度访问的支持
|
0.6.14 | 2017年7月 | - 添加对回调注入器中引用类型使用@Coerce 的支持,以支持派生类型。
|
0.6.13 | 2017年7月 | - 添加对覆盖方法的一致性可见性的支持,以匹配目标类。修复了目标类方法已被Access Transformer修改为具有更高可见性的问题
|
0.6.12 | 2017年6月 | - 将切片参数添加到@ModifyConstant
- 添加@ModifyArgs注入器,它可以使用单个处理程序更改多个方法调用参数。
|
0.6.11 | 2017年6月 | - 修复当同一唯一方法存在于多个针对同一类的 mixin 中时对@Unique的处理
- 修复合并 lambda 的处理,以便当目标类中已存在 lambda 时(在原始类中以及由早期 mixins 应用时),可以正确应用来自 mixin 的 lambda
|
0.6.10 | 2017年5月 | - (0.6.9) 小修复以消除对已弃用助手的依赖
- 尊重 Mixin 上包含的@At的重新映射
- 要求在调用超级控制器之前发生的重定向器是静态的
|
0.6.8 | 2017年2月 | - 允许@ModifyConstant在比较中挂钩隐式零
|
0.6.7 | 2017年1月 | |
0.6.6 | 2017年1月 | - 在 Java 8 及更高版本中允许访问器混入中的静态方法
|
0.6.5 | 2017年1月 | |
0.6.4 | 2017年1月 | |
0.6.3 | 2016年12月 | |
0.6.2 | 2016年12月 | - 添加对@Pseudo(虚拟目标)mixin 的支持
|
0.6.1 | 2016年11月 | |
0.6 | 2016年10月 | |
17.0.5 | 2016年10月 | - 允许 @Redirect 注入器针对构造函数重定向的新操作码
|
0.5.16 | 2016年10月 | - 注释处理器改进。支持多目标混合中的阴影和覆盖
- 支持AP中的可插拔混淆环境
|
0.5.14 | 2016年9月 | |
0.5.13 | 2016年9月 | |
0.5.10 | 2016年6月 | |
0.5.9 | 2016年6月 | |
0.5.8 | 2016年6月 | |
0.5.7 | 2016年6月 | |
0.5.6 | 2016年5月 | |
0.5.5 | 2016年4月 | - 添加@ModifyConstant注入器
- 添加@Debug注解
- 在实例方法中允许静态 @ModifyArg 处理程序
|
0.5.4 | 2016年4月 | |
0.5.3 | 2016年2月 | - 符合喷油器
- 如果代理处于活动状态,则自动启用热交换程序
- 修复注释处理器中泛型的多个问题
|
0.5.2 | 2016年2月 | |
0.5.1 | 2016年2月 | - 检修注入器,所有 mixin 中的注入器现在都会在实际处理任何注入器之前进行扫描。使注射器更具确定性。
|
0.4.19 | 2016年2月 | |
0.4.18 | 2016年2月 | |
0.4.17 | 2016年1月 | - 支持注释处理器中的 ExtraSRG
- 在参考图中包含构造函数
- 添加@Mutable注释以抑制@Final警告
|
0.4.15 | 2016年1月 | |
0.4.14 | 2016年1月 | |
0.4.13 | 2016年1月 | |
0.4.11 | 2016年1月 | |
0.4.10 | 2015年12月 | - 使用 RemapperChain 的运行时重新映射支持
- 忽略用 @Resource 修饰的类变压器
- 支持@reason 和@author 验证覆盖
|
0.4.8 | 2015年12月 | - 改进注释处理器以支持 MixinGradle
- 支持 refmap 中的多个目标混淆环境
|
0.4.6 | 2015年9月 | - 添加 INIT 阶段以处理早期 FML 启动
- 在 mixin 中添加对 lambda 的支持
- 添加对 mixins 中热代码替换的支持
- 改进 Java 8 功能支持
|
0.4.4 | 2015年7月 | |
0.4.3 | 2015年5月 | - 添加INVOKE_ASSIGN注入点
- 支持不带参数的注入器回调
- 支持回调中协变参数类型的强制
- 支持截断本地捕获注入器处理程序
- 使用 fernflower 对导出类进行运行时反编译
- 添加导出过滤器
|
0.4 | 2015年5月 | |
0.3.2 | 2015年4月 | |
0.3.1 | 2015年4月 | |
0.3 | 2015年3月 | |
0.2 | 2015年3月 | - 添加了 supermixin 支持(从其他 mixins 继承的 mixins)
|
0.1 | 2015年1月 | |