1204 字
6 分钟
使用 Docker 构建 Termux Packages 中指定的包

什么是 Docker?#

Docker 是一个使用 Golang 编写的开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

更多信息详见:runoob

说人话就是一个容器引擎,可以管理不同的容器(且容器之间不会相互影响)

如何使用 Docker?#

详见另一篇文章 《如何在 Ubuntu/Windows 上使用 Docker》

什么是 Termux Packages?#

Termux Packages 是一个用于 Termux(一个适用于 Android 的终端模拟器)的包构建系统。

说人话就是一个 “万能钥匙”,可以很方便地编译所需要的(适用于 Android的)包。

1.准备工作#

首先要确定我们需要编译的包,我这里就以 Zlib(一个著名压缩库)为例子。

使用 Git 将 Termux Packages 给克隆下来

Terminal window
# --depth=1 参数的意思是只需要最新的 commit(这样克隆速度快)
git clone https://github.com/termux/termux-packages.git --depth=1

接下来我们要修改配置。打开 termux-packages/scripts/properties.sh 并编辑。(Linux 上可以使用 Vim,Windows 可以使用自带的文本编辑器)

搜索 TERMUX_REPO_APP__PACKAGE_NAME,然后发现如下:

Terminal window
# ...
TERMUX_APP__PACKAGE_NAME="com.termux"
# ...
TERMUX_REPO_APP__PACKAGE_NAME="com.termux"
TERMUX_REPO_APP__DATA_DIR="/data/data/com.termux"
TERMUX_REPO__CORE_DIR="/data/data/com.termux/termux/core"
TERMUX_REPO__APPS_DIR="/data/data/com.termux/termux/app"
TERMUX_REPO__ROOTFS="/data/data/com.termux/files"
TERMUX_REPO__HOME="/data/data/com.termux/files/home"
TERMUX_REPO__PREFIX="/data/data/com.termux/files/usr"
# ...

将其修改为

Terminal window
# ...
TERMUX_APP__PACKAGE_NAME="你的软件包名"
# ...
TERMUX_REPO_APP__PACKAGE_NAME="你的软件包名"
TERMUX_REPO_APP__DATA_DIR="/data/data/你的软件包名"
TERMUX_REPO__CORE_DIR="/data/data/你的软件包名/termux/core"
TERMUX_REPO__APPS_DIR="/data/data/你的软件包名/termux/app"
TERMUX_REPO__ROOTFS="/data/data/你的软件包名/files"
TERMUX_REPO__HOME="/data/data/你的软件包名/files/home"
TERMUX_REPO__PREFIX="/data/data/你的软件包名/files/usr"
# ...

然后保存并退出文件,在当前 termux-packages/scripts 目录下,先确保 Docker 服务正在运行,然后我们启动镜像创造一个编译环境。

注意:这一步拉取镜像会很慢,一定要使用梯子去拉取(否则大概率连接超时)

Terminal window
# 对于 Linux 系统:
chmod 700 run-docker.sh
cd ..
scripts/run-docker.sh
# 对于 Windows 系统:
cd ..
scripts/run-docker.ps1

在进入容器后,我们需要先获取超级用户权限

Terminal window
# 将自身提权为超级用户
sudo -s

接下来我们需要安装编译所需要的包,这一步很重要

Terminal window
apt update # 更新当前软件包列表
cd scripts # 进入脚本目录
./setup-android-sdk.sh # 安装交叉编译所需的 Android SDK、Android NDK
./setup-ubuntu.sh # 安装编译所需及常用的软件包

最后返回构建根目录

Terminal window
cd ..

下面就是正式开始编译了!

2.开始编译#

已知我们需要编译 Zlib,那么我们使用 build-package.sh 脚本完成这件事。 这里的 zlib 是我们需要编译的包,如果需要编译别的包那就换成别的包名称(例如 nodejs) 使用 -a 参数可指定目标架构,这里我们指定为 aarch64 即可。

Terminal window
./build-package.sh zlib -a aarch64

编译会花很长的时间,请耐心等待。但是相比于编译一个 Linux 系统,还是要快很多的。 编译后产生的文件将会在 output 目录,里面的文件都是 .deb 格式,我们可以对其进行解压缩。

Terminal window
for file in output/*
do
dpkg -x $file /
done

解压缩完成后,文件将会在 /data/data/你的软件包名 中,这里我们使用 tar 进行压缩。

为什么不直接进行 zip 呢?这是因为 zip 会导致原本软链接的文件直接被替换并复制为原文件,空间占用会很大。而 tar.gz 或者 tar.xz 可以正确处理这些软链接的文件。

Terminal window
cd /home/builder/termux-packages && tar czvf zlib.tar.gz /data/data/你的软件包名/*

然后我们退出容器,在当前根目录下就有我们的 zlib.tar.gz 了。 可以使用 Common Compress 对 tar.gz 进行解压缩。

3.清理环境#

编译完成后如果没有什么特殊需求,我们可以删除这个容器。 首先先看一下容器 ID

Terminal window
docker ps -a

出现结果:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
384de2869811 ghcr.io/termux/package-builder "/bin/bash" 31 minutes ago Up 31 minutes termux-package-builder

这里的容器 ID 就是 384de2869811,你这里显示的是不一样的。

我们可以先停止这个容器

Terminal window
docker stop 384de2869811 # 这个是刚刚显示的容器 ID

然后删除容器

Terminal window
docker rm 384de2869811

我不推荐你删除镜像,因为镜像拉取还是很费网的。主要是镜像占用空间大。当前如果你想要删除也是可以的。

先确保你已经停止并删除了所有容器,然后就可以正常删除镜像。

先看一下镜像 ID

Terminal window
docker images

显示为

REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/termux/package-builder latest 830a35fed2cc 11 days ago 7.84GB

这里的 830a35fed2cc 就是镜像的 ID

接下来我们对镜像进行删除

docker rmi 830a35fed2cc

这样环境就清理完毕了!

使用 Docker 构建 Termux Packages 中指定的包
https://mucute-qwq.github.io/posts/build-termux-packages/
作者
一剪沐橙
发布于
2025-08-29
许可协议
CC BY-NC-SA 4.0