Termux packages高级编译手册 - 让安卓更强大的极客工具 (2)

1. 写在前面

系列文章第一篇:Termux进阶指南 - 让安卓更强大的极客工具 (1)

本文假设你已经学会以下知识:

  1. 会使用安卓手机
  2. 手机安装好Termux
  3. 学会在Termux上运行命令
  4. 本人熟悉使用Linux

假设你有以下设备:

  1. 一台安卓手机,用于安装和运行Termux
  2. 一台电脑,安装Ubuntu LTS版本。

2. 一些能提升效率的最佳实践

在开始讲解如何编译Termux package编译之前,有必要分享一些可以显著提高效率的最佳实践。
好的最佳实践可以大幅提升效率,让心情更愉悦,大大延迟从入门到放弃的时间和降低概率。

提升Termux运行命令效率的最佳实践

  1. 安卓手机连上蓝牙键盘
  2. 或者,手机运行sshd(具体见下文),电脑通过局域网wifi连接手机的ssh,来控制手机

Termux如何运行sshd,作为openssh server?

手机Termux上运行:

pkg install openssh
passwd # 设置当前用户密码
sshd # 启动openssh-server

电脑运行以下命令,或用ssh连接软件填入对应参数连接:

ssh -p 8022 xxx@[你的手机IP]

提升编译效率的最佳实践

直接使用Docker进行编译。
这样你将会少很多奇奇怪怪的操作系统独占问题。不管母鸡是Windows、mac或者本身就是Linux,都推荐使用docker运行Termux packages官方提供的Ubuntu镜像来编译。
这样编译环境可以一键启动,不会在你的Ubuntu系统上装上超级多的工具链,也不会有环境配置问题。

3. 编译前的准备工作

进入Docker前常见准备工作

克隆最新的Termux packages仓库:

git clone https://github.com/termux/termux-packages.git
cd termux-packages

运行Termux packages编译环境的docker:

bash scripts/run-docker.sh

进入docker环境后,就可以自由自在运行各种编译命令了。

一些Termux packages的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后一些有用的自定义设置

进入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内手动运行编译命令,不用脚本。
可以使用下面的环境变量,适合cmakemake等命令配置环境。
具体更多详细信息可以参考: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

4. 开始编译Termux package

首先确定已经按照上一节配置并进入docker。

以编译Python为例,默认先编译依赖,然后编译本体:

./build-package.sh python

如果希望依赖从官方apt repo下载,本地只编译本体:

./build-package.sh -I python

如何编译旧版软件?

举个例子,官方的python已经到了python 3.11,并且官方apt warehouse只保留最新的版本,无法再通过apt installpkg install安装旧版Python。怎么办?

假设还想用回Python3.10,可以自行编译回来,以下是详细步骤。

  1. 将git仓库切换回python 3.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,那就证明切换成功了。

  1. 清理编译缓存
# 清空已编译的packages的标记
rm -rf /data/data/.built-packages

# 清空所有已编译的缓存
rm -rf $TERMUX_TOPDIR && mkdir $TERMUX_TOPDIR
  1. 开始编译

熟悉的配方:

./build-package.sh python

注:不建议用-I参数,因为apt很多已经更新,老版本Pythony依赖可能会有兼容性问题。还是都通过源码重编比较好。

  1. 安装

编译成功后,将output目录的文件都拷贝到手机
然后在手机的Termux上执行以下命令手动安装(注意先装依赖再装本体):

dpkg -i xxx.deb

编译后如何自行托管apt服务?

编完后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

5. 更多参考文档

Leave a comment