前阵子朋友发来一个标题特别有冲击力的测试文章,大意是某个安卓 LLM 框架实测下来,直接把老牌本地推理工具比下去了。我点进去看了一圈,发现两个问题:一是所谓实测没有给出手机型号、内存、模型版本和上下文长度,结论根本没法复现;二是对比的参照物选错了,它把 Ollama 当成安卓本地推理的默认答案,这就导致整篇文章从头到尾都在打一个并不存在的靶子。
先说我的判断:在安卓本地推理这件事上,不该用“谁比谁强”来选型,而应该用“谁匹配你的交付形态”来选型。Ollama 在桌面和服务端确实是好用的工具,但它在安卓上的定位天然受限;真正值得你花时间对比的,是 llama.cpp 系、MLC LLM、MediaPipe 推理 API,以及芯片厂商的 NPU 方案。这篇文章会按这个思路展开,最后给出一套可以在自己设备上运行的验证流程。
1. 先把概念对齐:这里的“框架”不是编排框架
1.1 推理框架和编排框架,是两个层面的东西
搜索热词里有一个“LLM 应用为什么需要编排框架”,这个点特别容易和“安卓 LLM 框架”混在一起。LangChain、LlamaIndex 这类编排框架解决的是多个模型调用、工具调用、记忆管理、Prompt 拼装这些流程问题。它们本身不负责把模型跑起来,最后还是要调用一个真实推理后端,比如云端 API、本地服务,或者某个推理引擎。
而“安卓 LLM 框架”是另一层问题:如何把模型权重、推理内核、硬件加速和内存管理一起做成能在手机上稳定运行的东西。手机没有独立显卡,没有持续供电,内存还被系统占掉一大块,所以真正核心的工作是“在有限资源里把模型跑起来”。
选型时如果这两层混在一起聊,很容易出现拿编排框架的生态优势去比较推理框架,或者反过来,拿推理框架的部署细节去贬低某个生态工具。先把层次分开,下面的讨论才有意义。
1.2 安卓跑大模型,和桌面端有本质区别
Ollama 在 PC 上体验好,是因为 PC 的内存、磁盘、电源和散热都比较充裕。安卓设备则完全不同:
- 内存上限:系统本身占掉几个 GB,App 能申请的内存和驻留时间都有限。系统压力大的时候会直接回收后台进程。
- 存储与安装体积:一个 4 位量化后的 7B 模型大约 4GB 左右,加上应用本体,中低端手机安装压力不小。
- 发热与降频:持续生成 token 会让 SoC 温度快速上升,然后触发降频,生成速度肉眼可见地往下掉。
- GPU 与 NPU 差异:不同厂商的 GPU 驱动、NPU 接口差异巨大,同一个推理内核在不同手机上表现可能差很多。
- 生命周期:桌面端可以长期挂一个服务进程,手机上 App 切到后台就可能被系统冻结或回收。这决定了移动端很难照搬“常驻服务 + 外部请求”的模式。
这些差异决定了,你不能把 PC 上的选型逻辑直接搬过来,更不能拿一台 PC 上的速度测试代表安卓上的真实表现。
2. 为什么说 Ollama 不是安卓本地推理的默认选项
2.1 Ollama 的优势来自桌面与服务端形态
Ollama 做的事情,本质上是一个封装得很好的推理服务:管理模型仓库,处理 GGUF 格式的下载和转换,起一个本地 HTTP 服务,提供统一的 API 接口。开发者在 PC 上确实两步就能把模型拉下来跑起来,这对快速验证非常有价值。
但“好用的服务”和“能集成进移动应用的内核”是两个概念。Ollama 的模型拉取、服务管理、命令行交互都是围绕桌面和服务端设计的。手机上没有“常驻系统服务”这种天然形态,App 必须在前台或有限的后台时间内完成推理。把 Ollama 装进手机,本质上是在手机里模拟一个 Linux 服务环境,这和原生移动推理的体验差距很大。
2.2 想在安卓上“用 Ollama”,常见有三条路,但都有边界
第一条路是拿 Termux 一类环境在手机上跑 Ollama 服务。这条路能跑,但更像是在折腾实验环境:需要终端操作,Android 高版本对长驻进程有额外限制,模型下载、内存占用、耗电和崩溃恢复都要自己管。
第二条路是手机连接一台跑着 Ollama 的服务器或家里的 PC,手机端只做对话界面。这条路体验完整,模型能力也强,但本质是远程调用,强依赖网络。如果你的诉求是离线可用、数据不出手机,这条路不成立。
第三条路是放弃用 Ollama 做移动端运行时,改用能编译打包进 APK 的推理引擎,同时借鉴 Ollama 的模型管理和 API 设计思路,自己做一套移动端的模型加载与生成服务。这也是目前更接近生产实践的选择。
所以很多“某个框架直接超过 Ollama”的横评标题,多数是把这三条路混在一起讲。真正的问题不是 Ollama 好不好,而是你要的到底是本地推理还是远程推理,是开发体验还是最终 App 的安装体验。
2.3 比较之前,先回答三个问题
在开始对比框架之前,建议先回答:
- 模型必须完全离线运行在手机上吗,还是可以接受联网?
- 你的目标是做出一款能给别人安装的 App,还是自己在实验环境里跑通验证?
- 手头设备的芯片、内存、GPU 驱动能不能满足推理要求?
这三个答案基本决定了选择范围。不要一上来就搜“最强框架”,因为“最强”在这三个约束下没有统一答案。
3. 几条主流路径,分别解决什么问题
3.1 llama.cpp / Termux:自由度最高,但那是折腾型体验
llama.cpp 是很多本地推理方案的底层内核,支持 GGUF 格式,能通过 Vulkan、OpenCL 等接口做 GPU 加速。在安卓上,你可以通过 Termux 装一个 Linux 环境来运行,也可以用 NDK 把它编译进自己的 App。
这条路最大的价值是参数透明:模型层数、量化格式、上下文长度、各阶段消耗时长你都能看到。对于想研究推理性能、量化影响、访存瓶颈的人来说,这是很好的学习路径。
但缺点也很明显:手工操作多,模型文件管理要自己写,流式输出要自己接,出错时没有任何图形界面兜底。如果目标只是“快速做一个带本地模型的小工具”,直接挂 llama.cpp 需要不少时间。
3.2 MLC LLM:适合把模型编译进 APK 的产品化路线
MLC LLM 基于 Apache TVM 编译器,可以把模型编译成针对不同硬件后端优化的可执行包,也可以直接生成 Android Studio 工程。它支持常见的小尺寸 Transformers 模型,在移动端场景里经常被拿来打包成正式 App。
“编译”是它和 llama.cpp 最大的区别:它不是在运行时逐层解析模型,而是提前做算子融合、内存规划这些优化。这意味着它对同一台设备的性能上限,通常比通用解释式运行时更可控。
代价是构建链路重。需要配置 Python 环境、TVM 编译链、Android NDK,第一次构建很容易卡在依赖和版本上。如果只是想在手机上跑一个现成模型,走这条路会显得过度工程;但如果目标是发布到应用市场,它比 Termux 方案更接近生产形态。
3.3 MediaPipe LLM Inference API:Google 生态的快速集成方案
MediaPipe 提供的 LLM Inference API,可以把模型文件加载到 Android 应用里直接推理。它对部分小尺寸开放模型有专项适配,模型经过转换后可以打包进应用资源目录。
这条路的最大优势是接入成本相对低:整体步骤大致是下载模型、转换格式、把文件放到项目里,然后在应用里调用推理 API。团队里如果有人熟悉 MediaPipe,上手会很快。
需要留意的是,它的模型支持范围相对固定,不是所有 GGUF 都能直接转换;版本迭代也比较快,一些 API 在不同版本里的命名和调用方式会变。落地时建议先锁定一个稳定版本,再写业务代码。
3.4 NPU 厂商方案:性能上限高,但先想清楚维护成本
高通、联发科、三星等芯片厂商都有自己的 AI 加速 SDK。这类方案可以把部分算子放到 NPU 上执行,通常在功耗和持续生成的稳定性上比纯 GPU 更好。
但问题也很现实:不同厂商、不同代的 NPU 架构不统一,模型要经过算子对齐、量化校准、精度验证,甚至需要为不同机型分别调优。这对小团队来说不是可以长期维护的复杂度。
只有在产品形态已经验证、用户量稳定、需要追求极致能耗的阶段,我才建议专门投入这条路线。早期原型阶段用跨平台的 llama.cpp 或 MLC LLM 更容易验证需求。
3.5 用一张表把选择范围收窄
| 方案 | 部署形态 | 推理加速 | 适合阶段 | 主要门槛 |
|---|---|---|---|---|
| llama.cpp + Termux | 实验环境 | CPU/GPU(Vulkan/OpenCL) | 学习、研究、验证 | 终端操作、手工配置 |
| llama.cpp 编入 App | APK | CPU/GPU | 产品原型、轻量功能 | 需要 NDK 编译、自管模型 |
| MLC LLM | APK | 编译优化 + 多后端 | 产品化 App | 构建链重、学习曲线 |
| MediaPipe LLM Inference | APK | GPU/部分 NPU | Google 生态快速集成 | 模型支持范围有限 |
| 厂商 NPU SDK | APK | NPU | 正式产品、规模验证后 | 平台锁定、调优成本高 |
| Ollama 远程客户端 | 手机连服务器 | 服务器端 | 已有机器的场景 | 依赖网络、非端侧 |
注意:这个表里的“适合阶段”来自常见工程路径的经验判断,不是绝对排名。同一个项目在不同阶段,也可能换用不同方案。
4. 安卓端选型,我建议按这四步判断
4.1 第一步:先定义“本地”两个字
“本地跑大模型”这句话,在不同人嘴里含义不同。有人指的是模型文件在手机存储里,完全不联网也能用;有人指的是 App 内置一个轻量模型做摘要、改写、分类;还有人指的是手机连家里电脑上的 Ollama,只是界面在手机上。
前两种才需要看推理框架。第三种需要的是一个 Ollama 客户端,跟本文讨论的引擎选型无关。这个区分要最先做,它直接决定你接下来是折腾框架,还是只找一个好用的客户端。
4.2 第二步:按可用内存反推模型上限
选模型不是看“哪个模型强”,而是先看设备能不能装下。
一个粗糙的参考:8GB 内存的中端机,跑 3B 量化模型通常比较稳;16GB 内存的设备可以考虑 7B 量化模型;再大的模型通常要牺牲大量上下文长度或生成速度。这个经验值不是绝对标准,因为 GPU/NPU 加速、上下文长度、系统内存占用都会影响实际可用性,但它能帮你快速缩小范围。
我的建议是:先选一个小模型跑通全流程,比如 1B 到 3B 范围,确认框架、模型路径、输出接口都正常,再根据设备表现决定要不要升到 7B。不要一上来就想着跑大参数量模型,安卓端不是那个战场。
4.3 第三步:列出必须依赖的能力
有些能力会直接决定框架选择:
- 流式输出:几乎所有引擎都支持,但接入方式五花八门。
- 结构化输出:需要严格 JSON 输出时,有些框架有内置约束,有些只能靠 Prompt 或外部解析兜底。
- 多轮对话:需要自己管理上下文,有些框架的 API 会简化这一步。
- 自定义模型:如果不是常见开源模型,要关注转换工具链是否支持。
- 多模态输入:图片、语音输入会显著增加模型体积和推理压力,选型差异很大。
把这些能力列成清单,再逐项核对候选框架,比直接比较“谁快 20%”更有价值。
4.4 第四步:在你自己设备上做小样本实测
不要完全相信任何一篇“实测”文章的绝对结论,包括这篇。真正靠谱的做法是选两三个候选方案,在你自己手头的设备上,跑同一个模型、同一个 Prompt、同一个上下文长度,记录以下数据:
- 首 token 延迟
- 平均生成速度(token/s)
- 连续生成后的温升和速度变化
- 应用冷启动到首次可用的时间
- 模型文件占用和内存峰值
- 崩溃率和偶发卡顿
我一般会连续跑 5 轮对话,每轮生成 200 到 300 个 token,观察速度变化和发热趋势。只看一次输出、只测一个 Prompt 的结论,参考价值很低。
5. 真实落地时,最容易踩进这四个坑
5.1 模型下载与导入,比想象中更占时间
大模型文件本身就有几个 GB,下载慢、断连、空间不足都很常见。很多人遇到“下载一直失败”就开始怀疑框架,其实问题往往出在网络和文件管理上。
更稳妥的思路是先把模型文件在 PC 上下载好,再通过运行时支持的导入流程注册进本地环境。先解决“文件放到正确位置”,再解决“运行时识别模型”。另外,如果模型文件体积很大,不建议直接打进 APK 主包,否则安装包体积和首次安装解压时间都会失控,更适合首次启动后从应用私有目录加载,或者引导用户导入。
5.2 内存与系统回收,不只是框架的锅
安卓上跑模型,经常遇到的现象是:模型加载成功后,第一段生成正常,过一会儿系统把应用杀了。多数情况下这是内存压力问题,不是推理引擎本身的 bug。
排查时先看几件事:量化配置是否真正生效、上下文长度是不是设置过大、推理线程数是否过高、有没有同时加载多个模型。工程上,加载大模型前先做一次内存检查,失败时给用户明确提示,能明显降低崩溃率。
5.3 速度忽快忽慢,先确认是降频还是配置问题
同一个模型在不同时刻速度差异很大,大概率是发热降频。连续几轮长文本生成后,SoC 降频几乎必然发生,这属于硬件热设计决定,换框架解决不了。
务实的做法是在 UI 上展示生成速度,长对话后允许设备“冷静一下”。如果产品要求速度稳定,那就调小模型、缩短上下文,或者接受低延迟换取持续可用性。
5.4 一套可以复用的排查链路
当出现“没有输出、输出乱码、速度极慢”时,按这个顺序排查,不要一上来就换框架:
- 先看输入:Prompt 是否符合模型的对话模板?角色标签是否写对?
- 再看模型文件:量化格式是否可靠、文件是否完整、来源是否正确?
- 再看设备环境:剩余内存多少、系统版本是否过旧、依赖版本和 NDK 是否匹配?
- 再看参数:温度、top_p、上下文长度、线程数、批大小是否设置合理?
- 最后才回到框架:确认是不是当前框架对这台设备的硬件后端支持不足,再考虑切换。
经验里,绝大多数“必须换框架”的问题,最后都定位在第 2 步或第 4 步。先排除文件、排除参数,再谈框架优劣。
6. 回到主判断:别纠结“最强”,先想清楚“要不要本地”
6.1 本地推理不是所有场景的最优解
本地推理的核心收益是隐私、离线、低延迟和可控成本;核心代价是模型规模受限、硬件碎片化、维护成本高。如果你需要的只是“对话体验”,联网调用商用模型往往更稳定,迭代也更及时。
安卓端真正适合本地推理的场景,目前更多集中在:隐私敏感的数据处理,比如笔记、邮件、本地文档;无网络环境下的辅助工具;需要低延迟响应的交互功能;以及把离线推理当作一类“能力”而不是核心卖点的产品。在这些场景里,本地框架的价值才能兑现。
6.2 框架的长期价值在可维护性,不在第一次跑分
长期使用一个框架,最终决定体验的不是第一轮生成速度,而是:
- 模型文件怎么更新
- 新机型出问题怎么排查
- 推理线程和 UI 线程怎么配合
- 内存不足时怎么优雅降级
- 后续更换模型时,转换工具链是否顺手
这是我把 MLC LLM 和 MediaPipe 放在“产品化路线”里推荐的原因。它们的编译和集成方式更像一套可以长期维护的工程系统,而不是一次性实验脚本。
6.3 你现在最该做的五件事
如果你正打算在安卓上做本地 LLM 功能,建议按这样的顺序推进:
- 不要在框架选择上纠结超过两天。
- 先选一个小模型,用最容易跑通的方式跑起来。
- 记录一组基础数据:首 token、平均速度、内存峰值、发热趋势。
- 根据产品形态,决定继续用实验环境,还是走向编译打包。
- 如果要做产品,尽早把模型更新、内存不足、首次加载、失败重试这四类流程写进设计。
等你在真实设备上跑完一轮,那些“最强框架”的争论会自然消解。你会发现,真正决定项目成败的,往往是最开始那个看起来很小的问题:你需要在什么样的一台手机上,用多大内存,跑一个多大模型,拿来完成什么任务。把这个答案写清楚,比任何框架排名都管用。