旧手机给 AI 当沙盒:容器里编译单片机固件、跑 Web 后端
AI 做交叉编译测试,要在主力电脑上装整套 ARM 工具链,装完处理 PATH 与库冲突,测试完再卸。跑 Web 后端 demo,又要起 Node 或解释器环境。一次测试,主力机多出一堆临时环境。旧安卓手机接住这个活:Termux 里起 Debian 容器,工具链和 Web 服务都装在容器内,测试与主力机完全隔离。
沙盒结构
- Termux:Android 上的 Linux 环境,自带 clang 与包管理器,普通应用权限即可运行
- proot-distro:容器管理工具,无 root 权限,把发行版 rootfs 挂在用户目录下运行
- Debian 容器:proot 内装 Debian(glibc),承载裸机交叉工具链与 Web 后端
- 工具链:xpack arm-none-eabi-gcc 15.2.1,解压即用,无需安装
容器选型有一个硬约束:Termux 官方仓库没有 arm-none-eabi-gcc;xpack 的 aarch64 Linux 版是 glibc 动态链接,Alpine(musl)容器运行时报缺动态链接器,Debian(glibc)容器可以正常执行。容器必须与工具链的 libc 匹配。
单片机固件交叉编译
PY32 系列固件模板(Cortex-M0+,32 KB Flash / 4 KB RAM),70 个 C 文件(HAL 库全套)加启动汇编。arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb 交叉编译,全量构建通过:
- RAM 占用 2432 B / 4 KB(59.38%)
- FLASH 占用 6720 B / 32 KB(20.51%)
- Project.elf / Project.hex / Project.bin 三个产物完整生成
本机与手机耗时对比
| 环境 | 工具链 | 并行 | 全量耗时 |
|---|---|---|---|
| 本机 Windows | GCC 14.3.1 | Ninja 自动并行 | 6 s(热状态) |
| 手机(proot 容器) | GCC 15.2.1 | -j4 | 44 s |
| 手机(proot 容器) | GCC 15.2.1 | -j8 | 40 s |
本机首次全量编译 21 秒,之后稳定在 5-6 秒,差距来自磁盘冷缓存与杀毒软件首次扫描。手机稳定在 40-44 秒,约为本机的 7-8 倍。
Web 后端:mongoose + SQLite
同一个沙盒里跑另一个 demo:C 语言 mongoose 库起 HTTP 服务器,SQLite 存数据,前端 HTML 页面对接增删查接口。浏览器直接访问手机 IP 即可操作,增删查和搜索全部在手机本地完成。这一套环境同样没有进入主力机,验证完即弃。
八核并行收益与瓶颈
手机是 8 核,-j8 只比 -j4 快 4 秒。瓶颈不在 CPU 并行度,在 proot 虚拟化层的 IO 开销:每次文件读写都要经过 proot 路径翻译,编译过程大量临时文件的读写放大了这部分开销。手机单核性能本身也弱于主力机,并行无法补偿。
适用边界
值得用手机沙盒的场景:AI 驱动的工具链安装实验、交叉编译环境反复装包卸包的测试、Web 后端 demo 验证、需要隔离环境跑脚本。日常高频编译仍用主力机,6 秒与 40 秒的差距不值得为隔离付出。
边界两条:proot 容器无 root,涉及设备映射或特权操作受限;交叉工具链必须是 Linux aarch64 版本,与容器 libc 匹配。