Termux相当于一个Linux发行版,可以使用Termux的APP,在手机上运行一个Bash环境,在其中使用GCC/Clang编译软件。Termux支持包管理。
我这里主要使用Termux开发动态库。Termux自带的软件包,里面包涵的动态库是可以在APP中直接使用的。
Termux有4种CPU架构的版本:x86_64、i686、armhf(应该是没有再维护)、arm64(aarch64)。在Android的X86虚拟机下使用的通常是i686版本的Termux,编译出来的也是i686指令的elf文件。Termux目前还没有multiarch支持,不能交叉编译不同平台上的动态库。
我本身倾向用arm64版本的。在Win电脑上使用WSL2或者VMware,可以运行一个Linux环境。我使用Debian 10,通过qemu-static软件包,在Linux下可以支持执行arm64的elf文件。
在手机上安装Termux软件,进入软件后,将以下的文件夹打包拷贝到Linux环境下。
/system/etc
/system/bin
/system/lib64
/system/usr
/apex/com.android.tzdata
/apex/com.android.runtime
/data/data/com.termux/files/usr
/data/data/com.termux/files/cache
将上述的目录复制为
$HOME/termux/system
$HOME/termux/apex
$HOME/termux/data
使用sudo在Linux的根目录下为上述的3个上当创建软链接:
lrwxrwxrwx 1 root root 29 22月 23 10:57 apex -> /home/xxx/termux/apex/
lrwxrwxrwx 1 root root 28 22月 23 10:57 data -> /home/xxx/termux/data
lrwxrwxrwx 1 root root 30 22月 23 10:57 system -> /home/xxx/termux/system
安装qemu-static与binfmt软件包
执行
/data/data/com.termux/files/usr/bin/bash
bash需要专用的环境变量,一个样例如下:
export HOME=/data/data/com.termux/files/home
export TMPDIR=/data/data/com.termux/files/usr/tmp
export PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets
export ANDROID_ROOT=/system
export LANG=en_US.UTF-8
export LD_PRELOAD=/data/data/com.termux/files/usr/lib/libtermux-exec.so
export PREFIX=/data/data/com.termux/files/usr
export SHELL=/data/data/com.termux/files/usr/bin/bash
export ANDROID_ROOT=/system
export ANDROID_TZDATA_ROOT=/apex/com.android.tzdata
export LD_LIBRARY_PATH=/apex/com.android.runtime/lib64/
这样就可以在Linux环境下使用aarch64版本的termux生产软件了。
Android的DNS解析使用/dev/socket/dnsproxyd,需要使用的域名写入
/system/etc/hosts
GoLang运行时可能有问题,试着使用下面的方法,二选一
export GOMAXPROCS=1
export GODEBUG=asyncpreemptoff=1
可能与CFLAGS中的-g选项有关,去掉-g。