什么是 Docker?
Docker 是一个使用 Golang 编写的开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
更多信息详见:runoob
说人话就是一个容器引擎,可以管理不同的容器(且容器之间不会相互影响)
如何使用 Docker?
详见另一篇文章 《如何在 Ubuntu/Windows 上使用 Docker》
什么是 Termux Packages?
Termux Packages 是一个用于 Termux(一个适用于 Android 的终端模拟器)的包构建系统。
说人话就是一个 “万能钥匙”,可以很方便地编译所需要的(适用于 Android的)包。
1.准备工作
首先要确定我们需要编译的包,我这里就以 Zlib(一个著名压缩库)为例子。
使用 Git 将 Termux Packages 给克隆下来
# --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,然后发现如下:
# ...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"# ...将其修改为
# ...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 服务正在运行,然后我们启动镜像创造一个编译环境。
注意:这一步拉取镜像会很慢,一定要使用梯子去拉取(否则大概率连接超时)
# 对于 Linux 系统:chmod 700 run-docker.shcd ..scripts/run-docker.sh
# 对于 Windows 系统:cd ..scripts/run-docker.ps1在进入容器后,我们需要先获取超级用户权限
# 将自身提权为超级用户sudo -s接下来我们需要安装编译所需要的包,这一步很重要
apt update # 更新当前软件包列表cd scripts # 进入脚本目录./setup-android-sdk.sh # 安装交叉编译所需的 Android SDK、Android NDK./setup-ubuntu.sh # 安装编译所需及常用的软件包最后返回构建根目录
cd ..下面就是正式开始编译了!
2.开始编译
已知我们需要编译 Zlib,那么我们使用 build-package.sh 脚本完成这件事。
这里的 zlib 是我们需要编译的包,如果需要编译别的包那就换成别的包名称(例如 nodejs)
使用 -a 参数可指定目标架构,这里我们指定为 aarch64 即可。
./build-package.sh zlib -a aarch64编译会花很长的时间,请耐心等待。但是相比于编译一个 Linux 系统,还是要快很多的。
编译后产生的文件将会在 output 目录,里面的文件都是 .deb 格式,我们可以对其进行解压缩。
for file in output/*do dpkg -x $file /done解压缩完成后,文件将会在 /data/data/你的软件包名 中,这里我们使用 tar 进行压缩。
为什么不直接进行 zip 呢?这是因为 zip 会导致原本软链接的文件直接被替换并复制为原文件,空间占用会很大。而 tar.gz 或者 tar.xz 可以正确处理这些软链接的文件。
cd /home/builder/termux-packages && tar czvf zlib.tar.gz /data/data/你的软件包名/*然后我们退出容器,在当前根目录下就有我们的 zlib.tar.gz 了。
可以使用 Common Compress 对 tar.gz 进行解压缩。
3.清理环境
编译完成后如果没有什么特殊需求,我们可以删除这个容器。 首先先看一下容器 ID
docker ps -a出现结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES384de2869811 ghcr.io/termux/package-builder "/bin/bash" 31 minutes ago Up 31 minutes termux-package-builder这里的容器 ID 就是 384de2869811,你这里显示的是不一样的。
我们可以先停止这个容器
docker stop 384de2869811 # 这个是刚刚显示的容器 ID然后删除容器
docker rm 384de2869811我不推荐你删除镜像,因为镜像拉取还是很费网的。主要是镜像占用空间大。当前如果你想要删除也是可以的。
先确保你已经停止并删除了所有容器,然后就可以正常删除镜像。
先看一下镜像 ID
docker images显示为
REPOSITORY TAG IMAGE ID CREATED SIZEghcr.io/termux/package-builder latest 830a35fed2cc 11 days ago 7.84GB这里的 830a35fed2cc 就是镜像的 ID
接下来我们对镜像进行删除
docker rmi 830a35fed2cc这样环境就清理完毕了!