系列文章第一篇:Termux进阶指南 - 让安卓更强大的极客工具 (1)
本文假设你已经学会以下知识:
假设你有以下设备:
在开始讲解如何编译Termux package编译之前,有必要分享一些可以显著提高效率的最佳实践。
好的最佳实践可以大幅提升效率,让心情更愉悦,大大延迟从入门到放弃的时间和降低概率。
手机Termux上运行:
pkg install openssh
passwd # 设置当前用户密码
sshd # 启动openssh-server
电脑运行以下命令,或用ssh连接软件填入对应参数连接:
ssh -p 8022 xxx@[你的手机IP]
直接使用Docker进行编译。
这样你将会少很多奇奇怪怪的操作系统独占问题。不管母鸡是Windows、mac或者本身就是Linux,都推荐使用docker运行Termux packages官方提供的Ubuntu镜像来编译。
这样编译环境可以一键启动,不会在你的Ubuntu系统上装上超级多的工具链,也不会有环境配置问题。
克隆最新的Termux packages仓库:
git clone https://github.com/termux/termux-packages.git
cd termux-packages
运行Termux packages编译环境的docker:
bash scripts/run-docker.sh
进入docker环境后,就可以自由自在运行各种编译命令了。
进入Docker前的自定义参数:
# 自定义container name,如:
export CONTAINER_NAME=creke_termux_armv8
# 自定义镜像地址,如:
export TERMUX_BUILDER_IMAGE_NAME=ghcr.io/termux/package-builder
# 最后运行docker环境,自动应用上述参数
bash scripts/run-docker.sh
如何在docker内访问母鸡的127.0.0.1?
编辑scripts/run-docker.sh
,在$SUDO docker run \
下方适当位置加上--network host \
如何挂载更多本地目录?
在--volume $VOLUME \
下方加上--volume [母鸡目录]:[docker内目录] \
进入docker后,可以设置下面的环境变量,按需设置即可。
# 网络代理设置
export https_proxy=http://127.0.0.1:7071
export http_proxy=http://127.0.0.1:7071
export no_proxy="localhost,127.0.0.1,dl.google.com"
# 设定编译参数,按需调整
export TERMUX_PKG_API_LEVEL=24
export TERMUX_PKG_MAINTAINER=Creke
export TERMUX_ARCH=aarch64 # arm, aarch64, i686 or x86_64.
export TERMUX_TOPDIR=/home/builder/termux-packages/termux-build # 编译输出目录
# 路径设置,增强兼容性
export ANDROID_HOME=/home/builder/lib/android-sdk-9123335
export NDK=/home/builder/lib/android-ndk-r25c
export PATH=/home/builder/termux-packages/termux-build/_cache/cmake-3.24.2/bin:$PATH
通常在调试的适合,需要docker内手动运行编译命令,不用脚本。
可以使用下面的环境变量,适合cmake
、make
等命令配置环境。
具体更多详细信息可以参考:https://developer.android.com/ndk/guides/other_build_systems?hl=zh-cn
注:有host build或者在host build的时候不要用
注2:如果现在还不懂这一小节在说什么,请略过。
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export API=24
export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export AS=$CC
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export SETUPTOOLS_USE_DISTUTILS=local
首先确定已经按照上一节配置并进入docker。
以编译Python为例,默认先编译依赖,然后编译本体:
./build-package.sh python
如果希望依赖从官方apt repo下载,本地只编译本体:
./build-package.sh -I python
举个例子,官方的python已经到了python 3.11,并且官方apt warehouse只保留最新的版本,无法再通过apt install
或pkg install
安装旧版Python。怎么办?
假设还想用回Python3.10,可以自行编译回来,以下是详细步骤。
cd [你的termux-packages的git仓库目录]
git checkout bootstrap-2022.10.23-r1+apt-android-7 # 最新支持python 3.10的版本
确认packages/python/build.sh
里面的Python版本号,即_MAJOR_VERSION=3.10
,那就证明切换成功了。
# 清空已编译的packages的标记
rm -rf /data/data/.built-packages
# 清空所有已编译的缓存
rm -rf $TERMUX_TOPDIR && mkdir $TERMUX_TOPDIR
熟悉的配方:
./build-package.sh python
注:不建议用-I
参数,因为apt很多已经更新,老版本Pythony依赖可能会有兼容性问题。还是都通过源码重编比较好。
编译成功后,将output
目录的文件都拷贝到手机
然后在手机的Termux上执行以下命令手动安装(注意先装依赖再装本体):
dpkg -i xxx.deb
编完后dpkg安装,各种依赖要处理实在太麻烦,那怎么创建一个可自行托管的apt服务呢?
假设你已经有一个web服务。
在编译docker或Linux母鸡使用以下命令构建apt的相关文件和目录
pip3 install termux-apt-repo # https://github.com/termux/termux-apt-repo
# 在backup目录生成apt目录文件
cd xxx/termux-packages
termux-apt-repo --use-hard-links output backup stable main
# 同步到web服务的目录中(如果你用ftp或者其它方式那么请自行变通操作)
rsync --delete -rvP backup/dists xxx/www/html/termux-packages # 假设这里目录对应的是 https://creke.net/termux-packages
然后在手机的Termux上执行以下命令即可
echo "deb [trusted=yes] https://creke.net/termux-packages/ stable main" > $PREFIX/etc/apt/sources.list
cat <<EOF > $PREFIX/etc/termux/chosen_mirrors
WEIGHT=999
https://creke.net/termux-packages/
EOF
apt update
pkg search python # 确认python是自己编译的版本
pkg install python # 开心安装自己编译的python