Minecraft服务器:建立在安卓Termux下的一种尝试
前言
我手上的R5-3500U+20G(板载4G+16G单条)的电脑似乎对我现在自组的1.18.2整合包有点吃不消了,加上很久以前有网友建议是可以做一个局域网服务器减轻客户端电脑的压力实现较稳定的体验,于是我就有了想将服务端和客户端分离出来,拿现有的设备开服的打算。但手上只有几台用来挂QQ的旧手机,于是就开始找有没有用手机开JAVA服的教程,没想到确实有,通过Termux运行Linux来实现服务器的运行,但我只是一个会简单打理自己的Windows电脑,对Linux一窍不通的小白,好在利用Termux运行服务器的教程并不少,经过一番折腾+自己踩坑后总结出了这篇自认为很详细的部署流程,我也确实如愿以偿地跑起了我自己的局域网服务器了
......吗?
注:本流程仅涉及局域网内建立服务器,不包含内网穿透等支持远程连接的相关操作。
流程
1. 部署Termux
Termux官方源目前有两种下载方式,一种是Github上下载,一种是通过F-droid开源社区下载,只是这俩网站有随机抽风地问题,可能需要自行准备工具或者通过国内的第三方站点获取。官网和两种下载方式贴在下面。
官网:https://termux.dev/en/
Github:https://github.com/termux/termux-app#github
F-droid:https://github.com/termux/termux-app#f-droid
下载完毕后直接安装即可。
2. Termux中操作
注1:所有的命令都需要在输入相应命令后按下输入法或者键盘的回车键才会执行。
注2:出现下图中的绿色 ~ 后证明你的上一条命令已经执行完成(但不一定执行成功),可以执行下一条需要执行的命令了。

准备
1. 保持后台运行
下拉手机导航栏找到termux的通知,点击通知中的Acquire Wakelock,以确保termux能够一直在后台运行。

2. 换源与更新
进入Termux后我们需要对Termux进行换源,执行:termux-change-repo 命令,之后会出现下图的页面。

按下回车后会出现源的选择界面,通过termux软件中的上下方向键选择源,在这里我们选择清华源即可。

有时会显示大洲源,选择Chin即可。

等待换源完成后我们需要对Termux进行更新,执行:pkg update 命令,之后等待更新完成,期间会经历多次询问你是否继续

输入y并回车即可,期间会有4-5次询问你,一律输入y即可。
3. 获取手机储存权限
在换源与更新完成后,我们需要让termux获得访问手机内部文件系统的权限,执行termux-setup-storage 命令,之后可能会弹出询问权限,同意即可。
4. 部署流程需要的程序
执行:pkg install vim 命令,安装用于编辑文本的程序。
执行:pkg install wget 命令,安装用于下载Forge程序。部署原版服务器不需要这个。
5. 查询ip地址
执行:ifconfig 命令,可以查询到当前网络下本机的IP地址。
注:ifconfig 不是输入错误,而是确实可以通过这个命令查询地址,如果执行:ipconfig 命令后系统无法识别命令,就需要ifconfig查询。
内网的IP具体显示在wlan0的inet后,在添加服务器时输入对应位置的地址即可,通常会正常识别到。
部署JAVA
这里仅展示在Termux下部署JAVA17的流程,因为Termux即使换源也只能在服务器中检索到JAVA17的包。如果需要部署JAVA8等旧版本,需要在Termux中部署Ubuntu环境等方式操作,具体请参考下方链接的操作。

执行命令:pkg install openjdk-17 -y,-y 参数用于跳过安装确认提示。等待进度完成。
安装进度结束后,执行命令:java -version,用于检查java的安装环境。

部署服务器
在Termux上我首先尝试的安装原生服务器,之后才尝试重新安装mod服务器,因此我会以分支作为标题,用于区分两种版本的安装与部署。
如果只需要原版服务器,看分支1即可,1.12.2原生服务端可以通过分支2的Forge端获取。
如果需要安装Forge服务器,看分支2即可。
确认目录
首先我们需要确认一个你能在手机文件管理器中能够找到的位置,也为下文中存放mod提供便利。
首先在手机文件管理器中选择一个你能找到的位置,新建一个文件夹。
执行命令:cd /storage/emulated/0/你之前确定的路径,绿色符号 ~ 也会变成你现在所在的文件夹下,之后我们的操作都会在这个目录下执行。
示例:比如我在文件系统根目录下创建了一个名为:MinecraftServer1.18.2的文件夹用于存放我的服务器文档,现在我需要在termux中转移到这个目录下,执行命令:cd /storage/emulated/0/MinecraftServer1.18.2,之后就会跳转到这个目录下。

【分支1】部署原生服务器
1. 下载原生服务器
安装原生服务器可以直接在MC的官网(非网易版)上下载,但只能下载到最新的版本。需要下载旧版本比如1.16.5、1.12.2可以通过一种奇怪的方法:
MC的发布新版本后会发布一个更新公告页,比如:
https://www.minecraft.net/zh-hans/article/minecraft-java-edition-1-18-2
在更新公告页面中,最下面提供了服务器端的下载链接。直接点击下载就可以了。

而下载1.16.5就很简单了,将链接中的1-18-2改为1-16-5就可以跳转,下载链接的位置基本一样,但1.12.2无法通过这种方法下载,需要自己找Server包,或者通过安装1.12.2的Forge端获取对应的服务端。
2. 运行原生服务器
成功下载服务端后,先将服务端从下载的位置复制或移动到自己决定安装服务器的文件夹内,例如我自己的路径是:/storage/emulated/0/MinecraftServer1.18.2,那么我就需要将下载的服务器包复制或移动到文件夹:MinecraftServer1.18.2中。
在Termux中通过 cd 命令跳转到服务端下载的文件夹中。
执行命令:java -jar server.jar nogui
注:原生服务端的文件名称默认是server,如果你是第三方下载的文件,且文件名与上述的不一样,则要输入对应的文件名称。
3. 启动
在第一次安装时安装会自行中断,让你修改一个eula.txt。

执行:vi eula.txt 命令,之后会跳转进对应的文档中,

按下输入法中的按键 i,启用编辑模式,将文档最下方的eula=false改为eula=true,之后点击Termux中的esc,之后输入命令 :wq (前面的冒号也要输入)并回车保存退出。
再次执行上文的启动命令:java -jar server.jar nogui
之后等待,出现下图的回报证明服务器运行成功。

【分支2】下载Forge
1. 确认并下载Forge版本
首先先查询你需要安装的版本的Forge版本是多少,例如我查询到1.18.2最新版本的Forge是40.2.10。
在Termux中通过 cd 命令跳转到服务端下载的文件夹中。
执行命令(以1.18.2为例):wget http://files.minecraftforge.net/maven/net/minecraftforge/forge/1.18.2-40.2.10/forge-1.18.2-40.2.10-installer.jar ,并等待下载完成。
2. 部署Forge
执行命令(以1.18.2为例):java -jar forge-1.18.2-40.2.10-installer.jar nogui -installserver
中间的forge-1.12.2-14.23.5.2855-installer.jar是刚刚下载的Forge文件,如果是下载的其他的版本,则需要修改为对应的文件名,其他的不需要改动。
出现下图的文字即显示安装成功。

3. 启动
在这里先暂停一下,因为需要说明forge安装后的文件,该说明通过Windows下展示,但同样适于Termux。
Forge在1.12.2、1.16.5和1.18.2在运行installer.jar后获取的文件有区别:


因此:
对于1.12.2和,1.16.5,需要执行命令(以1.12.2为例):java -jar forge-1.12.2-14.23.5.2860.jar nogui
如果你只需要启动原版服务器,则执行命令(以1.12.2为例):java -jar minecraft_server1.12.2.jar nogui
对于1.18.2,需要执行命令:sh run.sh
先执行:ls 命令,可以检索到当前文件夹下的所有文件和文件夹。确认刚才安装的服务器文件夹是否放在当前目录内,如果安装后出现了蓝色文字的Server或者nstallserver等相关字样,大概率就是新安装后创建的文件夹。
通过 cd 命令切换到安装后出现的文件夹,用 ls 命令检查文件夹内是否存在上文图中各版本对应的文件,如果存在就执行上文提及的对应的命令。
等待一段时间。
在第一次安装时安装会自行中断,让你修改一个eula.txt,

执行:vi eula.txt 命令,之后会跳转进对应的文档中,

按下输入法中的按键 i,启用编辑模式,将文档最下方的eula=false改为eula=true,之后点击Termux中的esc,之后输入命令 :wq (前面的冒号也要输入)并回车保存退出。
再次执行上文提及的特定版本的启动命令,之后继续等待。出现下图的回报证明服务器运行成功。

连接
启动客户端后在多人游戏-添加服务器中输入之前查询到的IP地址,之后等待检索服务器,然后点击加入即可。

注1:如果没有入正,则需要在启动前先通过 vi 命令编辑server.properties文档,将文档中的online-mode=true改为online-mode=false,具体开启编辑以及保存步骤请参考修改eula.txt的步骤。
修改后正版账号的皮肤可能无法正常加载,我个人这边是这样。
注2:如果是Forge端,右边可能会有一个绿色的钩或者红色的叉,绿色的钩证明服务器与客户端的mod比对完全符合,能够进入;而红色的叉则是比对不符,如果你安装了一些客户端需装而服务器不需要安装的mod,通常情况下可以正常进入,如果安装了一些客户端、服务器需装但因为疏忽服务器未安装的mod,它会告诉你你缺什么mod,补上即可。
【仅对Forge端】加入mod
在安装mod前,需要执行:stop 命令关闭服务器。
安装mod就像客户端一样,将模组移到mod文件夹里即可。但需要注意mod能否需要在服务器中运行,比如Jei是只需要在客户端安装,服务器安装与否无所谓。
建议安装按批次安装mod,安装一批启动一次并通过客户端进入一次,以确定mod能够在服务器中正常运行。我个人的经历是我安装了一个村民优化的mod,安装后启动服务器就崩溃;而安装等价代换后我再也没进去过服务器。因此强烈建议安装一批启动一次,以免因为因排障大量消耗你的精力。
服务器的重载、关闭与再启动
有时因为设备性能,服务器在运行时可能会回报Can't keep up,这时候执行:reload命令,等待一段时间后就可以了,期间游戏可能会卡一会。
不想运行服务器了,执行:stop 命令即可。
重新启动服务器需要跳转到执行服务器命令对应的文件的存放位置才能执行启动。
参考教程

https://raidenkl.gitee.io/a2b7
后记
写完这篇流程时,我的服务器启动时间大概已经超过4天了,部署服务器时因为自己的认知水平踩了很多很多坑,我最接近开服的一次是成功在Ubuntu环境下启动了1.16.5的forge服务器,但我没法将mod转移进对应的文件夹中,因为远程传输一直无法正常启动,而我又将服务器安装在了termux自己的目录中,似乎是无法通过手机自带的文件管理器进行文件管理。直到后来我选择了1.18.2,并且理解了跳转路径的问题,这最后一步才得以解决。对于我而言这个过程很痛苦,但它给我带来的体验上的提升是超出预期的。
在设备上我一开始是打算在我用来挂QQ用的Mate 10 Pro上运行服务器,但因为内存只有6G,在它上运行原生服务器还可以,但我运行打了102个mod的包时,服务器会频繁报回报Can't keep up,这对于体验还是有不小的影响。最后我还是转移到了Y700上,8G运存加上骁龙870的SOC运行我现在102个mod的服务器还算能用,但内存还是有点捉急,运行起来后查询内存剩余大概就几百MB的空余。
联想的ZUI的游戏模式有一个旁路充电的功能,可以在游戏运行时通过充电器直接供电以实现更小的发热以及保护电池的功能,我个人不怎么玩手机游戏,但这个功能能够在服务器运行时提供非常好的效果。在运行服务器时将Termux添加进游戏模式并开启旁路充电模式并保持屏幕常亮,运行3-4小时也不怎么发热,完全不用担心因为长时间接电可能引发的电池发热问题,算是歪打正着了。
因为电脑不对成通道的问题,我在探索世界的时候很容易间歇性掉帧,即使是安装了一些优化mod也是如此,而服务端和客户端分离,也就是在其他设备上运行服务器后就没这个问题了,很少有掉帧的问题,而且内存占用十分小,在自己创建世界而不是进入服务器时,即使我将MC给到了5G内存,游戏依旧时不时的会吃掉6-7G以上的内存,即我有多少内存,除开系统和必须剩余出来的内存,其他的统统吃掉。而现在我的内存占用最低能达到1.2G左右,我可以利用剩下的内存运行更多的程序。

未来如果服务端设备升级我会考虑用Ubuntu或者其他带可视化UI的linux运行,如果继续在安卓设备上运行的话我可能也会考虑换到其他支持可视化UI的第三方Termux上,毕竟对于我这种纯小白来说,代码确实很简洁,但在文件复制和移动操作上我更喜欢可视化UI。
今年年底等时间空余出来了可能会尝试再写一篇关于使用Ubuntu环境安装1.16.5等旧版本的流程,记录一些尚未验证的个人猜想,当然这是后话了,现在在1.18.2上体验很好,如果我的Y700当时买大内存版应该体验会更好一点。