Android遛一遛春节返乡的小火车

7,285 阅读5分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

前言

春节临近,在深圳干活的打工人们却在为疫情烦恼,最近出了不少病例,希望赶紧平息,能开开心心回家吧~

这几天翻了翻好久都没有维护过了的hexo博客 苍耳的博客,自从换工作后就没有时间摸鱼和学习了,博客也自然而然就停滞了下来,一到双休日只想着睡觉。。。好了,言归正传,翻到了19年刚毕业的时候做的一个跟 Termux 相关的需求,疫情严重,返乡难定,跟大家分享一个挺可爱的嘟嘟火车吧~在 Android 设备上遛一遛。

没啥技术难度,纯粹图一乐~

Termux

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

简单使用

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

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

小火车

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

通过 apt 安装 sl 包:

$ apt install sl

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

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

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

其他用法

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

除了上面的小火车,还有很多有意思的命令,其中有些 Termux 也是支持的:

比如说黑客感的 cmatrix 命令:

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

效果:

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

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

效果:

通过ssh在电脑上连接termux

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

等等

把termux嵌入你的app

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

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

简单来说就是在初始化的时候会下载并解压一个 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。

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

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

写在最后

很多同学应该都玩过 Termux, 我个人觉得还是比较有意思的,大家都知道 Android 上的 shell 是阉割后的,而 Termux 可以在一定程度上使用 linux 的一些能力,还原 Android shell 的部分功能,甚至还可以在 app 里嵌入它来实现一些非常规的能力,喜欢折腾的同学可以试试~

都看到这里了的话,就点个吧。祝看到这里的各位同学新年快乐~来年越来越好,下班越来越早!

              忆王孙·书记
墨花纸染化龙飞,门掩窗寒瑟瑟吹。
今日闲情久假回。笔轻挥,平仄无声春似归。