「教程」在 Android 系统使用 Termux 安装 JDK 并运行 Minecraft 服务端

前言
在之前,发布过在 Android 系统开 Minecraft 服务器的教程,但由于时间比较久远,教程中的部分内容已经不适用。


因此抽空写了这篇新的教程,适用于新版本的 Termux 和 Android 系统,并补充了新的内容。
本教程基于 MIUI(Android 11),并在 Mokee 100.0(Android 10)测试通过。
本教程中可能会有描述不准确的地方,欢迎各位指出。
本教程适合有一定的开服经验者阅读。
建议先阅读文末的“常见问题和解决方法”和“补充内容”。
建议在网络环境较好的情况下进行相关的下载、安装操作。

准备
软件
Termux(建议使用最新版本,可在 F-Droid 上下载)
AnLinux(建议使用最新版本,可在 F-Droid 上下载;非必需)
MT管理器(也可以使用其它有文本编辑和解压缩文件功能的文件管理工具)
文件
文件不一定都用得上,请参考教程内容使用;相关文件的下载地址会在评论区中放出。
openjdk-11.0.1.tar.gz(来源:github.com/Lzhiyong/termux-ndk)
tagged_pointer.zip(来源:github.com/Lzhiyong/termux-ndk)
软件包(在 Termux 中安装)
不一定全部都需要安装,请参考教程内容进行操作。
clang
openssl-tool
proot
vim
wget

一、安装并启动 Termux
启动 Termux,等待初始化完毕,先执行一次 termux-setup-storage 命令,以便弹出“读写手机储存”授权对话框进行授权(也可以手动在系统设置中进行操作),然后执行一次 pkg update 命令。

建议在系统的通知栏中点击 Termux 通知中的“Acquire wakelock”,并锁定 Termux 的后台,防止 Termux 被系统关闭(使用完毕后点击“Release wakelock”)。


二、选择 Java 安装方式
不同的安装方式可以安装不同的 Java 版本,请根据需要进行选择。
不同版本的 Minecraft 服务端有各自的 Java 版本要求(例如:1.10.2 需要 Java 8、1.17 需要 Java 16)。
方式一、直接在 Termux 中执行命令进行安装
此方式最简单,但目前只能安装 OpenJDK 17(可能无法正常启动旧版本的服务端)。
1. 执行 pkg search openjdk 命令进行搜索,搜索结果中有一个“openjdk-17”(之后可能会有其他版本)。

2. 执行 pkg install openjdk-17 -y 进行安装(-y 参数用于跳过安装确认提示;pkg install 可简写为 pkg i),等待进度走完,没有错误提示就安装好了。

3. 执行 java -version 命令,若出现版本信息,则安装成功,可进入下一步。

方式二、在 Termux 中解压 JDK 文件手动安装
此方式比较麻烦,且只能使用专门为 Termux 编译的 JDK,若直接使用 ARM 版本的 JDK,会因为找不到动态链接库文件而无法启动。
目前只有 OpenJDK 11 可以使用(有一个 JDK 8 的安装脚本,测试下没安装成功就没放上来,有需要的话可以访问 github.com/Hax4us/java 进行了解)。
由于是手动安装,需要配置环境变量,否则不会被识别。
01. 下载“openjdk-11.0.1.tar.gz”文件,放置于手机储存中比较容易找到的地方(例如“Download”文件夹)。
02. 在 Termux 中执行命令创建一个用来放置 JDK 文件的文件夹,并进入,例如:
cd ~(进入“home”文件夹)
mkdir jdk(创建 jdk 文件夹)
cd jdk(进入创建的文件夹)

03. 执行命令,将下载的文件复制到该文件夹中:
cp /sdcard/Download/openjdk-11.0.1.tar.gz .
(将“Download”文件夹中的“openjdk-11.0.1.tar.gz”复制到当前的文件夹中;末尾的“.”表示当前文件夹)
04. 执行 ls -a 命令,可以看到文件已经被复制进来。

05. 执行 tar -xzf openjdk-11.0.1.tar.gz 命令,将该文件解压到当前文件夹。
06. 执行 rm openjdk-11.0.1.tar.gz 命令,将文件删除(也可以不删)。
07. 记下 OpenJDK 的路径,之后设置环境变量的时候需要用到。
注:教程中的路径是 ~/jdk/openjdk-11.0.1(开头的“~”表示“home”文件夹)。
建议执行一次 chmod +x ~/jdk/openjdk-11.0.1/bin/* 命令或 chmod 777 ~/jdk/openjdk-11.0.1/bin/* 命令以添加“执行权限”(请根据实际情况修改路径)。

08. 执行 pkg install vim -y 命令,安装编辑器。

09. 执行 vim ~/.bash_profile 命令,打开编辑器,修改环境变量。
在新安装的 Termux 中,应该没有这个文件,该文件会在保存后被创建。

10. 点击“i”进入插入模式(此时左下角会显示“INSERT”),然后输入以下内容(请根据实际情况修改路径):
export JAVA_HOME=~/jdk/openjdk-11.0.1
export PATH=$PATH:$JAVA_HOME/bin

11. 输入完毕后,点击“ESC”,输入“:wq”,按下“回车”键可保存并关闭文件。


12. 执行 exit 命令退出当前的会话(由于没有其他的会话,Termux 会自动关闭),然后重新打开 Termux。
13. 执行 java -version 命令,若出现版本信息,则安装成功,可进入下一步。

方式三、在 Termux 中安装 Ubuntu 后安装
此方式需要先借助 AnLinux,复制命令,在 Termux 中自动下载脚本安装系统后,再执行命令安装 JDK。目前可以安装的版本有 OpenJDK 8 和 OpenJDK 11(可安装只有 JRE 的版本)。
1. 安装“AnLinux”软件,然后运行,根据提示进行操作。
2. 在“仪表板”中选择需要安装的系统(Ubuntu)。


3. 复制显示的命令,到 Termux 中粘贴并执行。

注:可能会因为网络原因安装失败,此时需要根据提示的内容进行不同的操作。
一般来说,若在输出的内容中已经出现“Resolving...”“Connecting...”之类的提示,则表示命令开头的“pkg install”部分已执行成功,但在后续的下载安装脚本、Rootfs 文件的过程中出现错误,否则直接再次执行复制的命令即可。


对于文件下载失败(输出的内容中会有类似“Unable to establish connection”“Connection timed out”“Unexpected EOF in archive”的提示),执行 ls -a 命令,查看是否有“ubuntu.sh”“start-ubuntu.sh”“ubuntu-rootfs.tar.gz”“ubuntu-binds”“ubuntu-fs”这几个文件(文件夹)。若有则执行 rm -rf 文件名 命令将其删除(也可以直接执行 rm -rf *ubuntu* 命令),才能再次执行复制的命令,否则可能会被误认为文件已经下载完成或出现其他问题。


如果文件下载完毕且安装成功,就会出现像这样的提示:

4. 执行 ./start-ubuntu.sh 命令,进入系统。
注:如果不在“home”文件夹下,可以执行 ~/start-ubuntu.sh 命令。
下次进入时也一样,如果需要退出,执行 exit 命令即可。
5. 执行 apt update 命令,检查更新。

6. 执行 apt search openjdk 命令进行搜索,搜索结果中有 OpenJDK 8 和 OpenJDK 11。

7. 根据需要选择一个版本,执行 apt install 软件名称 命令进行安装,等待进度条走完,没有错误提示就安装好了。
例如安装 OpenJDK 8,执行 apt install openjdk-8-jdk-headless -y 命令。
由于不使用图形界面,安装“headless”版本即可。
如果不需要使用 JDK,可以只安装 JRE(openjdk-8-jre-headless)。
8. 执行 java -version 命令,若出现版本信息,则安装成功,可进入下一步。


三、启动 Minecraft 服务端
该步骤的操作与在电脑端开服的操作类似,下列内容仅供参考,请根据实际情况和需要进行调整。
1. 将服务端文件夹放置于手机储存或 Termux 中合适的地方(文件路径最好没有中文),然后在服务端文件夹中创建一个 Start.sh 文件(文件名可以不一样,但文件扩展名必须是 .sh)。
1) 在文件内写入:java -Xms最小内存 -Xmx最大内存 -jar 服务端文件名 nogui
例如:java -Xms128m -Xmx1024m -jar minecraft_server.1.16.5 nogui
3) 在文件尾插入一空行
4) 保存文件

2. 回到 Termux,执行 cd 命令,把当前的工作目录切换到服务端文件夹。
例如:cd /sdcard/Files/Termux/Minecraft_1.16.5/

3. 执行 sh Start.sh 命令(Start.sh 是第 1 步中创建的文件),启动服务端。
如无意外,会提示需要接受 EULA 协议并自动停止服务端。

4. 回到文件管理器
1) “刷新”一下,可以看到多了一些文件,其中的“eula.txt”是稍后要操作的文件。
2) 使用文本编辑器打开“eula.txt”。
3) 阅读文件中的链接指向的《MINECRAFT 使用者授權合約》。
4) 阅读完毕后,把文件中的“eula=false”改为“eula=true”接受协议并保存文件。

5. 然后重复第 3 步的操作就可以启动服务端了。

四、内网穿透(可选)
在局域网中,服务器的 IP 为路由器给手机分配的局域网 IP(可通过路由器设置静态 DHCP 或在手机上设置静态 DHCP 进行固定)。
若要让非局域网内的玩家进入到服务器,需要拥有公网 IP,并在路由器进行相关的端口转发设置;如果没有公网 IP,可以使用内网穿透软件进行映射。
以 Sakur Frp 为例:
1. 到官网注册账号(若无)并登录。
2. 创建隧道(Java 版服务端使用 TCP 隧道)。
3. 下载客户端(frpc),版本为“Linux (arm64)”。
4. 将下载的 frpc 放置于 Termux 中(因为需要“执行权限”)。
可通过在 Termux 执行 wget 下载地址 命令的方式(需要先安装 wget),直接下载到 Termux 中。也可以在浏览器中下载之后,执行 cp 文件路径 目标路径 命令或 mv 文件路径 目标路径 命令的方式将文件复制或移动到 Termux 中。

5. 执行 chmod +x frpc_linux_arm64 命令(文件名可能不一样),添加“执行权限”。

6. 查看“隧道列表”,点击“配置文件”,复制其中的“启动参数”。


7. 回到 Termux,执行 ./frpc_linux_arm64 启动参数 命令(文件名可能不一样)。
注:可以在当前文件夹中创建一个 .sh 文件,然后把命令写入其中,方便启动(例如 vim start.sh)。

8. 如果需要退出,可以按下 Ctrl + C 组合键。

常见问题和解决方法
执行 java 命令时提示“Bad system call”
可以尝试执行 pkg install proot 命令安装“proot”(只需要安装一次),然后在执行 java 命令前执行一次 termux-chroot 命令(每个会话只需要执行一次)。
启动 Minecraft 服务端时提示“Pointer tag for ... was truncated. Aborted”
这个问题可能会在 Android 11 使用“方式二”安装 JDK 时出现,下载“tagged_pointer.zip”,参考其中的“README.md”进行操作,有可能解决。





Minecraft 服务端输出内容的中文乱码
在“Start.sh”文件的命令行中添加“-Dfile.encoding=UTF-8”参数
例如:java -Xms256M -Xmx1024M -Dfile.encoding=UTF-8 -jar minecraft_server.1.16.5.jar nogui
在安装的 Ubuntu 系统中访问手机储存中的文件
执行 vim ~/start-ubuntu.sh 命令,点击“i”,进入插入模式,根据提示修改脚本:移除“#”,取消注释




补充内容
Termux
从左侧向右划可打开侧边栏,此时可创建多个会话。
安装“Termux:Styling”(可在 F-Droid 上下载)后可以调整 Termux 的样式。
Vim 操作提示
打开编辑器时,默认是“正常模式”,点击键盘上的“i”可进入“插入模式”(此时左下角会显示“INSERT”),然后就可以编辑内容。进入“插入模式”后,点击“ESC”可回到“正常模式”。
点击“上”“下”“左”“右”箭头可以移动光标。
在“正常模式”下,点击键盘上的“u”可以进行撤销操作。
在“正常模式”下,输入“:wq”,按下“回车”键,保存并关闭文件(输入“:w”,仅保存;输入“q”,仅退出;输入“:q!”,不保存并关闭)。
简单的性能测试
此测试为简单的单方面测试,仅供参考,请以实际情况为准。
方式三
循环次数:平均 62,258,629.67 次 / 8s(2)
启动用时:平均 30.462s(2)



方式二
循环次数:平均 61,196,394 次 / 8s(3)
启动用时:平均 29.641s(1)



方式一
循环次数:平均 63,632,232.67 次 / 8s(1)
启动用时:平均 33.987s(3)


