本帖最后由 nsisogf 于 2020-2-7 18:41 编辑
前言
如果你突然好奇,为何一夜之间,MCBBS出现了大量支持1.13+Forge自动安装的工具或启动器
这一切的起源于我在启动器开发者群里面喊了一声:
原理介绍
要想独立安装Forge,必须基于对安装器的分析,才可能用另一种语言来实现
经过四天对原版 Forge Installer的分析,我已经大致了解安装核心的操作方法
Forge installer源码:https://github.com/MinecraftForge/Installer
首先是对Forge Installer代码文件进行分析
主要的Class都在Installer/src/main/java/net/minecraftforge/installer/
其中
actions 文件夹是集合大部分主要安装函数的Class
json 文件夹顾名思义,是json的具体Object,用于解析
DownloadUtils.java 主要负责下载的class
FixSSL.java 顾名思义
HashFunction.java 计算/校验文件哈希值的主要class
InstallerPanel.java UI面板class
ProgressFrame.java 也是和UI有关(进度反馈)的class
SimpleInstaller.java 程序的主入口点,也是我们研究开始的地方
其中重要的部分我已经用黑体加粗标识,这些是我们要进行研究的部分
程序启动时,对照主类,就是SimpleInstaller,执行main方法
首先启动器会分析传递的命令行
分别有
--installServer 安装服务器版本forge
--installClient 安装客户端版本forge
--extract 解压
--offline 离线安装
你可能会问,命令行不是有--installClient吗?还写这么多干啥??
别问,问就自己去试试
当时我假高兴了半天就是因为这鬼玩意
检测完命令行,它会根据你的命令(或者UI界面中的选择)
指派Action和target,分别是安装的动作器和目标
这里的action是在actions文件夹中的一个抽象类,由其衍生出来两个action
分别是ClientInstall和ServerInstall
因为我们要研究安装在客户端的内容,我们开始移步至ClientInstall
当然在研究的开始,你也要看一下其继承的Action类,里面有重要内容,因为篇幅问题,这里不会再具体介绍。
当然在这之前,安装器会读取自身的Installer profile,里面有很多重要的内容
包括类库,目标,很多参数,处理器都在里面
其中重要的三部分:
Data,这个字典(java里叫map)装着重要的安装数据
它的value可以是Artifact的字符串代表([]开头结尾)也可以是数据内容,也可以是单纯的file(路径)
官方得说明:
/*
* Can be in the following formats:
* [value] - An absolute path to an artifact located in the target maven style repo.
* 'value' - A string literal, remove the 's and use this value
* value - A file in the installer package, to be extracted to a temp folder, and then have the absolute path in replacements.
*/
Processors安装器的主要表示,也是很重要,执行安装调用这里的东西
这个是一个list,列表
其中jar是processor自身的jar包(Artifact表示)
classpath是引用的库文件,是一串jar文件(Artifact文件),用于将来安装时中的-cp
args是参数列表,字符串数组
其中args可能有两种情况:
/*
* Arguments to pass to the jar, can be in the following formats:
* [Artifact] : A artifact path in the target maven style repo, where all libraries are downloaded to.
* {DATA_ENTRY} : A entry in the Install#data map, extract as a file, there are a few extra specified values to allow the same processor to run on both sides:
* {MINECRAFT_JAR} - The vanilla minecraft jar we are dealing with, /versions/VERSION/VERSION.jar on the client and /minecraft_server.VERSION.jar for the server
* {SIDE} - Either the exact string "client", "server", and "extract" depending on what side we are installing.
*/
方括号是Artifact表达,大括号是数据,在Data里面的东西
Libraries不用多说,安装要用的所有库文件都在这里
到时候要下载的库文件就是这里面的东西
好东西全在ClientInstall,也是这篇研究报告的重点:
以下是他的执行步骤:
1.检查minecraft target是否存在,其实就是游戏版本的jar包
2.检查launcher_profile.json是否存在,用于后期的注入
3.从安装器中,解压出forge版本的引导json
4.几乎上一整片,都是对安装目标的处理,包括文件补全等等,这些不必要进行介绍
5.下载Installer需要的库文件,这个在前面json说到了,是libraries
6.调用Processor安装器,这时候我们移步到PostProcessor(actions文件夹里)中,执行processor的主要类
7.将data字典中的value,全部转换为有效路径,既,artifact(方括号)变成库文件路径,数据(引号)去掉符号直接不变,文件,切换成文件路径
8.再data中新加两个值,Side是client还是server,minecraft_jar,目标jar包路径
9.遍历每个processor,按顺序在每个processor中执行以下步骤
9.1.将args中的参数用data字典中的值替换
9.2.获取processor的jar和主类(JAVA以外语言读主类需要读META文件)
9.3.用java,执行processor中的jar文件,其中-cp是里面的classpath列表,主类写进去,将所有args替换好的参数,放进去
9.4.等待进程退出
10.等待每个processor完成任务,按需注入launcher_profile
就这样,安装顺利完成了
是不是看起来一点都不难,赶紧去试试吧(阴笑,说着简单)
实现案例
我已经用C#实现了不依赖外部加载的方式安装
源码在nsiso启动器中,地址:
https://github.com/Nsiso/NsisoLauncher/tree/dev/src/NsisoLauncherCore/Util/Installer/Forge
没意外的话,我应该是除了java外的语言,第一个实现的!(自豪),.NET 第一人(吹牛)
最后的话
我很感谢,所有在这个项目中帮助过我的人
尤其是
* bangbang93 java方面及程序指导,以及下载服务器提供
* 海螺螺 java方面指导
* 33 java方面,安装思路指导
* 喵喵喵? 下载forge安装包和补全的时候一直用的是TA的服务器
如果没有这些大佬的帮助,也就不会有这个Forge安装器
最后,我的源码遵守nsiso启动器的协议,就是GPLV3,使用及学习时请注意
前言
如果你突然好奇,为何一夜之间,MCBBS出现了大量支持1.13+Forge自动安装的工具或启动器
这一切的起源于我在启动器开发者群里面喊了一声:
原理介绍
要想独立安装Forge,必须基于对安装器的分析,才可能用另一种语言来实现
经过四天对原版 Forge Installer的分析,我已经大致了解安装核心的操作方法
Forge installer源码:https://github.com/MinecraftForge/Installer
首先是对Forge Installer代码文件进行分析
主要的Class都在Installer/src/main/java/net/minecraftforge/installer/
其中
actions 文件夹是集合大部分主要安装函数的Class
json 文件夹顾名思义,是json的具体Object,用于解析
DownloadUtils.java 主要负责下载的class
FixSSL.java 顾名思义
HashFunction.java 计算/校验文件哈希值的主要class
InstallerPanel.java UI面板class
ProgressFrame.java 也是和UI有关(进度反馈)的class
SimpleInstaller.java 程序的主入口点,也是我们研究开始的地方
其中重要的部分我已经用黑体加粗标识,这些是我们要进行研究的部分
程序启动时,对照主类,就是SimpleInstaller,执行main方法
首先启动器会分析传递的命令行
分别有
--installServer 安装服务器版本forge
--installClient 安装客户端版本forge
--extract 解压
--offline 离线安装
你可能会问,命令行不是有--installClient吗?还写这么多干啥??
别问,问就自己去试试
当时我假高兴了半天就是因为这鬼玩意
检测完命令行,它会根据你的命令(或者UI界面中的选择)
指派Action和target,分别是安装的动作器和目标
这里的action是在actions文件夹中的一个抽象类,由其衍生出来两个action
分别是ClientInstall和ServerInstall
因为我们要研究安装在客户端的内容,我们开始移步至ClientInstall
当然在研究的开始,你也要看一下其继承的Action类,里面有重要内容,因为篇幅问题,这里不会再具体介绍。
当然在这之前,安装器会读取自身的Installer profile,里面有很多重要的内容
包括类库,目标,很多参数,处理器都在里面
其中重要的三部分:
Data,这个字典(java里叫map)装着重要的安装数据
它的value可以是Artifact的字符串代表([]开头结尾)也可以是数据内容,也可以是单纯的file(路径)
官方得说明:
/*
* Can be in the following formats:
* [value] - An absolute path to an artifact located in the target maven style repo.
* 'value' - A string literal, remove the 's and use this value
* value - A file in the installer package, to be extracted to a temp folder, and then have the absolute path in replacements.
*/
Processors安装器的主要表示,也是很重要,执行安装调用这里的东西
这个是一个list,列表
其中jar是processor自身的jar包(Artifact表示)
classpath是引用的库文件,是一串jar文件(Artifact文件),用于将来安装时中的-cp
args是参数列表,字符串数组
其中args可能有两种情况:
/*
* Arguments to pass to the jar, can be in the following formats:
* [Artifact] : A artifact path in the target maven style repo, where all libraries are downloaded to.
* {DATA_ENTRY} : A entry in the Install#data map, extract as a file, there are a few extra specified values to allow the same processor to run on both sides:
* {MINECRAFT_JAR} - The vanilla minecraft jar we are dealing with, /versions/VERSION/VERSION.jar on the client and /minecraft_server.VERSION.jar for the server
* {SIDE} - Either the exact string "client", "server", and "extract" depending on what side we are installing.
*/
方括号是Artifact表达,大括号是数据,在Data里面的东西
Libraries不用多说,安装要用的所有库文件都在这里
到时候要下载的库文件就是这里面的东西
好东西全在ClientInstall,也是这篇研究报告的重点:
以下是他的执行步骤:
1.检查minecraft target是否存在,其实就是游戏版本的jar包
2.检查launcher_profile.json是否存在,用于后期的注入
3.从安装器中,解压出forge版本的引导json
4.几乎上一整片,都是对安装目标的处理,包括文件补全等等,这些不必要进行介绍
5.下载Installer需要的库文件,这个在前面json说到了,是libraries
6.调用Processor安装器,这时候我们移步到PostProcessor(actions文件夹里)中,执行processor的主要类
7.将data字典中的value,全部转换为有效路径,既,artifact(方括号)变成库文件路径,数据(引号)去掉符号直接不变,文件,切换成文件路径
8.再data中新加两个值,Side是client还是server,minecraft_jar,目标jar包路径
9.遍历每个processor,按顺序在每个processor中执行以下步骤
9.1.将args中的参数用data字典中的值替换
9.2.获取processor的jar和主类(JAVA以外语言读主类需要读META文件)
9.3.用java,执行processor中的jar文件,其中-cp是里面的classpath列表,主类写进去,将所有args替换好的参数,放进去
9.4.等待进程退出
10.等待每个processor完成任务,按需注入launcher_profile
就这样,安装顺利完成了
是不是看起来一点都不难,赶紧去试试吧(阴笑,说着简单)
实现案例
我已经用C#实现了不依赖外部加载的方式安装
源码在nsiso启动器中,地址:
https://github.com/Nsiso/NsisoLauncher/tree/dev/src/NsisoLauncherCore/Util/Installer/Forge
没意外的话,我应该是除了java外的语言,第一个实现的!(自豪),.NET 第一人(吹牛)
最后的话
我很感谢,所有在这个项目中帮助过我的人
尤其是
* bangbang93 java方面及程序指导,以及下载服务器提供
* 海螺螺 java方面指导
* 33 java方面,安装思路指导
* 喵喵喵? 下载forge安装包和补全的时候一直用的是TA的服务器
如果没有这些大佬的帮助,也就不会有这个Forge安装器
最后,我的源码遵守nsiso启动器的协议,就是GPLV3,使用及学习时请注意