这是一个个人实验项目:未完成、不稳定、不推荐使用。 仓库保留源码与演进记录,不再主动开发,不发布任何发行版。
基于 Android 平台的 AI 客户端实验。核心架构为 安卓应用壳 + 自编译 proot 的用户态 Linux 执行层(Ubuntu 24.04 rootfs,四架构)。
本环境不标榜“轻量/精简”:它随 proot 虚拟化运行,体积、依赖都偏厚重;之所以选择 proot,是为了在无 root 的第三方应用权限下拿到一个真正可执行、可被脚本 / CLI / AI 工具驱动的近乎完整 Linux 用户态,而不是为了“小而美”。
EN(English): English README — 中文为权威主档。
这一节是本项目最重要的一节,请先读它,其余描述都次之。
- 作者没有亲手编写过任何一段实现代码。 全部代码由 AI 生成(绝大多数为网页端 AI 与编码代理),作者负责需求拆解、方向取舍、真机验证与 Bug 定位。
- “会看/会判断”与“会写代码”是两回事。 作者了解这些技术、能把工具组合起来,但从未独立写出实现代码。
- 本 README 的早前版本存在大量夸大描述(由 AI 起草),所列“能力/进度”并不代表实际可用程度;本仓库的代码是反复修补的产物,未经一次系统性重构或对齐,因此基础功能(如工具调用)长期不稳定。
- 没有任何一个模块被“认真做好”;本项目的全部所得,更像是一份踩坑记录,而非可用的软件。
- 个人评估 / 学习 / 测试用途;不发布编译版本 / 不上架。
- 感谢所有参与产出的 AI 工具——这段经历本身有它的意义;但也仅此而已。
- 若确有代码级复用,相应许可随之生效,见 LICENSE / THIRD_PARTY_NOTICES。
- Gradle 发行版:gradle-8.14;Gradle JDK:JDK 21
- Android Studio:Android Studio
- proot / loader 为预编译产物,随仓库提交;如需自行重建见「预编译来源」一节。
- 运行/依赖前置:clone 后先执行
bash scripts/fetch_deps.sh拉取被移出 git 的最小编译引擎(sherpa-onnx-1.13.5.aar→app/libs/)。 - proot 工具链已转为自编译静态版本(四架构),不再依赖
files.default.*内的旧 proot 与libtalloc.so.2。 - rootfs 可自行构建:
files.default.*.tar.gz.so(四架构)由scripts/rootfs/从源码编译生成;详见scripts/rootfs/README.md。
| 能力 | 说明 | 状态 |
|---|---|---|
| proot 容器部署页 | 12 镜像源可切换、断点续传、SHA256 固化校验、伪 200 校验 × 解压 | ✅ 在用 |
| 容器解压 | proot --link2symlink <libtar.so> -xJf,硬链接自动降级为符号链接 |
✅ 真机验证 |
| 容器启动 | Ubuntu 24.04.5 LTS / uid=0(root) / aarch64,--root-id + env -i |
✅ 真机验证 |
伪造 /proc |
内置 proot_proc.tar.xz + 运行时抓取宿主数据(默认启用,兼容 LXC 用户态) |
✅ 在用 |
| AI 工具 | bash / read / write / edit / ls / grep / find(原生命名,描述不暴露底层) | ✅ 在用 |
| 路径沙箱 | AI 只见容器内路径;补全 → symlink 写穿 → rootfs 拼接;宿主路径不可达 | ✅ 在用 |
| 符号链接语义 | 读写链接指向的真实文件,链接本身保留,并回传 link_warning |
✅ 在用 |
| 能力 | 说明 | 状态 |
|---|---|---|
| 协议方言 | openai-completions / openai-responses / anthropic-messages(覆盖约 82% 模型) |
✅ 在用 |
| 模型注册表 | 39 家 provider / 1312 个模型,含定价、上下文窗口、最大输出 | ✅ 在用 |
| 动态模型发现 | 轮询 OpenAI 兼容 / Anthropic / Google 的模型端点,与静态基线合并并持久化 | ✅ 在用 |
| 费用计算 | 与 pi 同源公式:输入/输出/缓存读写 + 阶梯定价 + Anthropic 1h 缓存 2 倍 | ✅ 在用 |
| 配置编辑页 | 独立 Activity:基础 + 高级参数(默认收起)+ 动态自定义参数,默认 128K 上下文 | ✅ 在用 |
| 用量落库 | usage_json / cost_total / 缓存 token 写入 chat_record,消息下方显示 token 与费用 |
✅ 在用 |
| 模块 | 说明 | 状态 |
|---|---|---|
| AI 对流对话 | 流式 SSE,多会话 + 历史 | ✅ 在用 |
| Tool Calling | 解析 → 执行 → 回注 → 递归循环 | ✅ 在用 |
| Think / 工具日志 | 思考块展示 / 调用记录入库 | ✅ 在用 |
| 终端执行/远端 SSH | 本地 Shell(PTY) + JSch 远端 | 🟡 遗留(AI 侧已不再暴露 PTY 工具) |
| 音频(ASR/TTS/KWS/声纹) | sherpa-onnx / vosk 离线端侧能力 | ⏸️ 短期搁置 |
| MCP 服务端 | HttpServer 实现 | 🟡 可能收回内部,或改用 MCP 客户端 |
files.default.*.tar.gz.so(四架构) —— 打包内容为 Termux 的$PREFIX(files/default/即 Termux 的usr/),也就是 Termux bootstrap rootfs:内含bash/ coreutils /curl/ssh/apt/dpkg/tar/proot/unzip等,来源为 termux/termux-packages 的构建产物与下载源;如需自建,可按其构建流程(Docker)编译对应包后重新打包。libproot.so/libproot-loader.so(jniLibs,四架构) —— 自编译静态 proot 与 loader,见下方「预编译来源」。libtar.so(jniLibs,四架构) —— 静态编译的 GNU tar(与 rootfs 同源于 termux-packages,但不同构建流程:此为静态链接、零依赖): 只为一个零依赖的解压工具(rootfs 内的bin/tar依赖 Termux 动态库环境),叠加进jniLibs供解压流程直接调用;与执行权限无关。 待办:其静态构建流程尚未固化(需修改多个包体),暂用既有产物。app/src/main/assets/proot_proc.tar.xz—— 伪造/proc数据包(来自proot_proc项目)。app/src/main/assets/models.json—— 模型与定价注册表(由 pi 的 provider 数据转译)。
- 执行层收尾:容器内工具的错误恢复、超时策略、输出截断、只读模式等细化。
- AI 接入扩展:补齐其余协议方言(Google Generative AI / Vertex、Bedrock、Mistral)与对应 provider。
- 费用与统计:会话/全局累计费用视图;历史消息重进会话显示价格。
- 配置能力:模型名搜索、Provider 自定义端点模板、配置导入导出。
- MCP:优先以客户端形态接入远端,或直接调用
mcp-cli。 - 音频(搁置):短期不深度更新;如推进再评估 VAD/KWS 悬浮监听、SDK/AAR 等候选。
| 文件 | 内容 |
|---|---|
docs/MCP.md |
MCP 定位(服务器模式 = 开发者调试/开发,与内部 AI 无关)与短期规划 |
docs/LOGGING.md |
统一日志实现记录与短期规划 |
docs/PROOT_HARDLINK_FIX.md |
proot 伪硬链接 ENOENT 修复记录 |
docs/PROOT_LINK_SEMANTICS_REPORT.md |
proot 链接语义修复与残余限制 |
docs/ANDROID_EXEC_RESTRICTION.md |
Android 私有目录可执行文件机制 |
文档约定:先看本 README,再看 docs/ 下活跃文档。历史长报告已删除,可在 git log 中查阅。
客户端内置 39 家 provider / 1312 个模型的元数据与定价,主流可直接选用的包括:OpenAI、Anthropic、DeepSeek、Google Gemini、xAI Grok、Qwen 通义千问、Moonshot Kimi、Z.ai GLM、MiniMax、Mistral、Groq、Cerebras、Together、Fireworks、OpenRouter、Vercel AI Gateway、Cloudflare Workers AI、Hugging Face、NVIDIA、Baseten、Amazon Bedrock、Azure OpenAI、GitHub Copilot、Cline/OpenCode 等;同时兼容任何 OpenAI 风格的自建 / 本地端点(Ollama、llama.cpp、one-api / new-api 网关等)。协议上已实现 Chat Completions、Responses、Anthropic Messages 三种方言,其余方言(Google / Bedrock / Mistral 等)的数据已就位,待接入。
开发中参考 / 借鉴 / 直接使用了许多开源项目:Termux(Android 终端仿真与 termux-shared 思路)、termux/termux-packages(Android 用户态工具链与补丁的上游源头)、termux/proot(proot 及 loader 源码)、Android-Terminal-Emulator(终端视图与仿真)、TMOE(proot 容器安装/启动流程的重要参考)、Android-Proot-Builder(proot 交叉编译流程参考,本项目在其基础上扩展了 32 位架构支持)、proot_proc(伪造 /proc 数据包)、talloc(proot 依赖的内存库,现已静态链接)、k2-fsa/sherpa-onnx 与 onnxruntime(离线语音)、alphacep/vosk-api(语音识别)、pi.dev(Agent 工具设计与多协议 provider 抽象的参考)、以及 AndroidX / OkHttp / Gson / JSch / Media3 / Lottie / Markwon 等 Gradle 依赖。各项目许可与版权归其各自所有者,具体以各上游 LICENSE 为准。
app/src/main/jniLibs/ 下的四架构 libproot.so 与 libproot-loader.so,是用 Android NDK r28c(aarch64-linux-android28 / armv7a-linux-androideabi28 / i686-linux-android28 / x86_64-linux-android28 交叉工具链)从 termux/proot 源码编译的,talloc 以静态链接并入,最终产物仅依赖 libc.so 与 libdl.so;编译流程参考 Android-Proot-Builder 并扩展了 32 位目标。
四架构 files.default.*.tar.gz.so(rootfs)来自 termux/termux-packages:由本项目用 scripts/rootfs/ 下的脚本自行编译(仅 bash + openssh 及其依赖),
经路径重定位(com.termux→alin.android.alinos、files/usr→files/default)与硬链接→软链接转换后打包。
| 脚本 | 作用 |
|---|---|
build-rootfs.sh |
总调度:改造 properties.sh → Docker 编译 bash+openssh → 打包 → 清理(四架构循环) |
pack-rootfs.sh |
解包 deb → 路径批量替换 → 硬链接转软链 → tar 打包 |
replace-paths.sh |
硬编码路径批量替换(可独立使用,支持 --dry-run) |
README.md |
环境要求、分步手册、产物自检与排错 |
关键点:官方 build-package.sh 默认产出 .deb,本项目不用其 dpkg 安装机制,而是将 deb 内容解包到目标路径再打包;
包体内只有软链接、无硬链接;tar 打包时不加 -h(否则软链会被展开为实体副本)。
待办(短期不做):
libtar.so(静态 GNU tar)构建流程尚未固化。 它与 rootfs 同源,但不能用scripts/rootfs/得到(那是动态构建); 静态化需 tar 及其依赖链(lzma/zstd/bzip2/iconv 等)全部静态编入, 而这些包在 termux-packages 中默认动态构建,当时修改了多个包体才编译成功, 改动面大、难以一并固化;暂沿用既有四架构产物(已真机验证可用)。
感谢一路参与开发、调试、资料与代码协作的 AI 工具(绝大多数为网页端):pi(https://pi.dev ,近期方向梳理、大规模代码协作与仓库整理)、DeepSeek(https://chat.deepseek.com ,早期代码生成、接口对接与云端 API 调试)、Kimi(https://www.kimi.com ,早期代码拼接与长文阅读)、Claude(https://claude.ai ,复杂逻辑排查与代码审查)、通义千问(https://www.tongyi.com ,资料查询与汇总)、豆包(https://www.doubao.com ,早期代码生成与资料查询),以及其它在排查、翻译、文档整理过程中提供过帮助的模型。此处只作开发历程致谢,不构成任何推广或担保,仍以实际使用方式为准。
坦白记录:这个项目历经很久、做了很多探索;早期在“轻量精简”上反复折腾、结果往往越叠越重。现已按现实收敛写入本 README。
Copyright © 2026 heworkalin. All rights reserved.
本项目为个人学习与测试(评估)用途,不发布编译版本 / 不发行 / 不上架;发行前会另行评审许可兼容性。
本项目基于 / 嵌入了多个第三方开源组件,版权归各所有者;使用本项目即代表接受这些上游许可约束。完整清单见 LICENSE 与 THIRD_PARTY_NOTICES.md。摘要:
com.termux.*/termux-shared/ 原生环境 — Termux (termux-app):主体 GPLv3,个别 MIT / Apache-2.0 / GPLv2+Classpath。- 本地运行环境工具链(bash / ssh / coreutils 等)— termux/termux-packages:构建脚本 + Android 适配补丁的上游源头;各包许以其中各自声明为准。rootfs 由本项目自行编译(
scripts/rootfs/),归属与许可证义务不因构建方式而改变。 - proot / proot-loader(自编译)— termux/proot:GPLv2;
loader同源。以静态链接方式并入的talloc— LGPL-2.1+。 libtar.so— GNU tar,GPLv3。- 伪造
/proc数据包 — proot_proc,许以该仓库声明为准。 - 模型与定价元数据(
assets/models.json)— 转译自 pi 的 provider 数据,许以该上游声明为准。 com.termux.terminal/view— Android-Terminal-Emulator:Apache-2.0。- 音频引擎 — k2-fsa/sherpa-onnx(含 onnxruntime)、alphacep/vosk-api:Apache-2.0 / MIT(模型许以各原始声明为准)。
alin.android.alinos原创代码及 Gradle 三方(AndroidX / JNA / okhttp / gson / media3 / lottie / markwon-prism 等)— Apache-2.0 / MIT / LGPL,细节见 NOTICE。
第三方组件协议以其原始声明为准。