前言

Termux是 Android 设备上的一款终端扩展软件,可以用来扩展 Android 设备上被阉割的 shell 功能,开源且不需要 root(工作空间就在app的私有目录下),它支持 apt 管理软件包,并拥有自己的 apt 仓库源。
Termux 会维护他们的软件仓库源,仓库里有很多常用的软件包,比如说 curl, python 等等,因此可以实现支持 Python, PHP, Go, Nodejs, MySQL 等的功能环境。

作者:苍耳叔叔

从终端启动Android Studio android 终端app_python

简单使用

Termux 的GitHub仓库地址,可以在这里面查看安装方式。安装成功后第一次打开它会下载解压 bootstrap 包,主要用来在应用的私有目录下设置一个类 Linux 的文件结构,并设置环境变量等等。初始化完成后在 termux app 的私有目录下会解压出以下文件结构:

从终端启动Android Studio android 终端app_从终端启动Android Studio_02

初始化完成后可以看到它就是一个 Linux Terminal 一样的界面,可以在里面跑 shell 命令了。然后还可以通过 apt 来安装管理软件,记得先 apt update 更新一下哈~

小火车

接下来试试在 Android 手机上的小火车效果,作为一个懒人,当然是直接使用现有的轮子了。
通过 apt 安装 sl 包:

$ apt install sl

如果嫌弃手机输入命令太麻烦的话可以借助 adb 通过电脑输入(记得切换输入法为英文哦):

$ adb shell input text 'apt\ install\ sl'

安装完成后执行 sl 命令即可看到一只可爱的小火车啦:

从终端启动Android Studio android 终端app_python_03

其他用法

一些没用但看起来有意思的命令

除了上面的小火车,还有很多有意思的命令,其中有些 Termux 也是支持的:
比如说黑客感的 cmatrix 命令:

$ adb shell input text 'apt\ install\ cmatrix'

效果:

从终端启动Android Studio android 终端app_python_04

比如说俄罗斯方块(跟扫雷一样适合上班摸鱼):

$ adb shell input text 'apt\ install\ bastet'

效果:

从终端启动Android Studio android 终端app_Android_05

通过ssh在电脑上连接termux

有需要的话可以通过 ssh 在电脑上连接你的 termux 终端,然后在电脑 terminal 上操作。网上有很多教程,这里就懒得抄了。

把termux嵌入你的app

记得 19 年刚毕业的时候,遇到一个需求需要在我们的 app 里执行 python 脚本,由于一些原因不能在服务器上运行,只能在本地执行,因此需要在 app 上嵌入 python 环境,考虑之后决定使用 termux, 通过当时的一些线上数据,发现它的兼容性确实还可以。

做这个之前得先了解一下 termux 的实现原理,之前有简单记录过(最新版可能有所修改),直接贴链接: Termux解析

从终端启动Android Studio android 终端app_bootstrap_06

简单来说就是在初始化的时候会下载并解压一个 bootstrap 包到应用私有目录的 files 下,其文件结构大致如下:

bootstrap-aarch64
    ├── SYMLINKS.txt
    ├── bin
    ├── etc
    ├── include
    ├── lib
    ├── libexec
    ├── repo.asc
    ├── share
    ├── tmp
    └── var

对 linux 比较熟悉的同学估计会觉得很面熟~然后 fork 子进程,并开启终端,设置环境变量,创建符号链接等等。

采取的方案是把 termux 终端等冗余的逻辑都去掉,只留下核心的 shell 功能,抽出一个用来接收命令输入和返回结果的工具类,并简单实现了一个连接池,并行接收命令。

两个挑战:

1.termux 提供的 bootstraps 包以及 apt 仓库源里的软件们都是跟他们的包名 com.termux 绑定的,因此需要自定义包名并重新编译。

解决办法:重新编译,参考之前的笔记 termux-app修改包名,在 docker 里把这些 apt 仓库源里的软件重新编译了一份,并在公司的服务器上搭建了一个 apt 仓库源,然后自定义打包一个 bootstrap 包,让其能通过 apt 去自定义的仓库源里安装 python。

2.从下载 bootstrap 到安装 python 一整套流程需要下载的量有几十兆了,所以给自己提了个需求,缩减下载量。

解决办法:从需求目的上来看,我需要的只有 python 环境,什么 apt 之类的都只是下载安装 python 的手段,因此最后我去掉了 apt 的能力,直接把 python 打包进 bootstrap 包,并裁剪了 bootstrap 里一些非必要的能力,最终用户只需要下载 6M 左右的包。