Содержание
Llama cpp Android: как запустить модель на телефоне
Черновик готовит редакция с помощью ИИ. За стандарт издания отвечает главный редактор — Валерий Курземнек.
Материал редакции Зерокодера. Счёт по выдаче снят собственным прогоном 16 октября 2026 года; цитаты источников приведены дословно. Обновлено: октябрь 2026.
Llama cpp Android: как запустить модель на телефоне — собрать движок под arm64, положить GGUF-файл в память устройства и вызвать llama-cli с разумным размером контекста. Документация проекта в репозитории ggml-org описывает три пути: сборка GUI-обвязки в Android Studio, сборка CLI прямо в Termux и кросс-компиляция через Android NDK. Ниже — порядок действий, выбор квантования по объёму ОЗУ и проверка офлайн-режима.
Что говорит документация llama.cpp про Android
Раздел docs/android.md в репозитории проекта llama.cpp описывает Android как поддерживаемую платформу с тремя сценариями сборки. Первый — GUI-обвязка: в документации сказано «Build GUI binding using Android Studio», то есть каталог examples/llama.android импортируется в Android Studio, синхронизируется через Gradle и собирается как обычный Android-проект. Второй — CLI в Termux: терминальный эмулятор с Linux-окружением, установка которого не требует root-прав, а сам пакет распространяется через Google Play, репозиторий проекта и F-Droid. Третий — кросс-компиляция CLI на хосте через CMake и Android NDK.
Отдельно документация фиксирует аппаратную поддержку: Android-биндинг поддерживает ускорение вплоть до SME2 для Arm и AMX для x86-64, автоматически определяет железо хоста и подгружает совместимые ядра. По формулировке источника, это позволяет работать и на свежих флагманах, и на старых устройствах с ограниченной памятью без ручной настройки. Для читателя это означает: отдельно выбирать «версию под Snapdragon» не нужно, движок сам подстроится под доступные инструкции CPU.
В документации также упомянут минимальный Android-фронтенд, включённый в репозиторий для демонстрации базовых функций биндинга. Если нужен готовый продукт с системными промптами, бенчмарками и визуализатором Arm-фич, документация отсылает к приложению Arm AI Chat в Google Play, которое поддерживают группы Arm CT-ML, CE-ML и STE.
Практический вывод из этого раздела: перед сборкой стоит определиться, нужен ли вам интерфейс приложения или достаточно командной строки. Для быстрой проверки идеи хватает Termux и llama-cli. Для встраивания в собственное приложение — Android Studio и биндинг. Для воспроизводимой сборки под конкретный ABI — NDK и CMake.
Выбор сборки: Termux, Android Studio или NDK
Три пути различаются по трудозатратам и по тому, где в итоге живёт бинарник. Сравнение по документации проекта:
| Путь | Где собирается | Что нужно | Когда уместен |
|---|---|---|---|
| Termux | На самом телефоне | Termux, git, cmake, libandroid-spawn | Быстрая проба, скрипты, отладка |
| Android Studio | На хосте | Android Studio, Gradle, SDK | Приложение с UI и биндингом |
| Android NDK | На хосте | Android SDK, NDK, CMake | Воспроизводимая сборка под ABI |
Для Termux документация приводит последовательность: обновить пакеты, установить git, cmake и libandroid-spawn, затем следовать инструкциям сборки для CMake. Termux даёт Linux-подобное окружение, и внутри него llama.cpp собирается как на обычной Linux-машине.
Для Android Studio документация предписывает импортировать каталог examples/llama.android, выполнить Gradle sync и собрать проект. Этот путь даёт готовый минимальный фронтенд: разбор метаданных GGUF через GgufMetadataReader из ContentResolver или локального файла, получение InferenceEngine через фасад AiChat и загрузку модели по приватному пути приложения, отправку промпта с автоматическим форматированием шаблона и сбор сгенерированных токенов в Kotlin Flow.
Для NDK документация требует подготовленного окружения кросс-компиляции с установленным Android SDK. Важная деталь: Android поставляет ограниченный набор нативных библиотек, и CMake при сборке через NDK видит только их. Команда конфигурации задаёт toolchain-файл NDK, ABI arm64-v8a, платформу android-28, флаги -march=armv8.7a и отключает GGML_OPENMP вместе с GGML_LLAMAFILE. OpenMP в NDK требует установки как зависимости CMake, что на момент написания документации не поддерживается. Llamafile, по замечанию того же источника, не поддерживает Android-устройства.
Документация добавляет, что конфигурация рассчитана на современные устройства, а llama.cpp содержит runtime-проверки доступных возможностей CPU, поэтому сборка под armv8.7a остаётся работоспособной и на более старых чипах. ABI при необходимости меняется под целевую платформу.
Подготовка окружения телефона
Порядок зависит от выбранного пути, но общие требования совпадают. Для Termux документация перечисляет шаги: apt update && apt upgrade -y, затем apt install git cmake libandroid-spawn. Termux ставится без root-прав, а сам пакет доступен экспериментально в Google Play, а также напрямую из репозитория проекта и на F-Droid.
Для кросс-компиляции на хосте нужен Android SDK и настроенный NDK. Документация подчёркивает: окружение должно быть готово к кросс-компиляции программ под Android, иначе CMake не найдёт toolchain. После клонирования репозитория перейдите в его каталог. Полный NDK-маршрут из документации начинается с конфигурации; ANDROID_NDK должен указывать на установленный NDK:
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-28 -DCMAKE_C_FLAGS="-march=armv8.7a" -DCMAKE_CXX_FLAGS="-march=armv8.7a" -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF -B build-android
cmake --build build-android --config Release
cmake --install build-android --prefix {install-dir} --config Release
adb shell "mkdir /data/local/tmp/llama.cpp"
adb push {install-dir} /data/local/tmp/llama.cpp/
adb push {model}.gguf /data/local/tmp/llama.cpp/
adb shell
Замените {install-dir} и {model}.gguf на свои пути. В shell устройства перейдите в /data/local/tmp/llama.cpp и выполните показанный ниже запуск с LD_LIBRARY_PATH=lib. Так один выбранный путь покрывает конфигурацию, сборку, доставку файлов и первый запрос.
Доставка бинарников на устройство через ADB описана так: создать каталог /data/local/tmp/llama.cpp, отправить туда установочный каталог и GGUF-файл, войти в shell устройства. При запуске установленных исполняемых файлов документация требует явно указать LD_LIBRARY_PATH=lib, потому что Android не находит путь к библиотекам самостоятельно. В поздних API-уровнях поддерживается RPATH, и это поведение может измениться.
Отдельно стоит освободить место под модель и под саму сборку. GGUF-файл занимает объём, сопоставимый с его размером на диске хоста, а сборка добавляет промежуточные артефакты. Для Termux это означает проверку свободного места в домашнем каталоге, для ADB-пути — в /data/local/tmp.
Выбор GGUF по объёму памяти
Документация llama.cpp не даёт таблицы «модель — объём ОЗУ», поэтому ориентир строится на размере самого файла и на контексте. Практическое правило: файл GGUF должен укладываться в свободную память с запасом на контекст и служебные буферы. Документация отдельно предупреждает про размер контекста: значение нужно задавать разумным, начиная с 4096, иначе потребление памяти подскакивает и терминал завершается.
| Что учитывать | Как влияет | Что делать |
|---|---|---|
| Размер файла GGUF | Занимает память постоянно | Брать квантование, влезающее в свободное ОЗУ |
| Размер контекста | Растёт с числом токенов | Стартовать с 4096, увеличивать постепенно |
| Свободное место | Нужно для загрузки и сборки | Освободить перед скачиванием |
| Runtime-проверки CPU | Влияют на скорость | Полагаться на автоопределение железа |
Модель документация советует скачивать, например, с Hugging Face и размещать в домашнем каталоге ~/ для лучшей производительности. Команда загрузки в документации выглядит как curl -L {model-url} -o ~/{model}.gguf. Для ADB-пути модель скачивается на хост-систему, а затем отправляется на устройство.
Выбор квантования — компромисс между качеством ответов и объёмом. Более агрессивное квантование уменьшает файл и оставляет больше памяти под контекст, менее агрессивное сохраняет качество, но требует больше ОЗУ. На устройствах с ограниченной памятью документация прямо допускает работу: биндинг рассчитан и на старые устройства с ограниченным объёмом RAM. Конкретные сочетания «модель — квантование — устройство» проверяются на месте, потому что доступная память зависит от запущенных приложений.
Перед запуском стоит закрыть фоновые приложения и убедиться, что система не выгружает процесс. Если терминал завершается с сообщением о нехватке памяти, первым шагом уменьшают контекст, вторым — берут файл GGUF меньшего размера.
Первый запрос через llama-cli
Минимальный запуск в Termux документация описывает командой ./build/bin/llama-cli -m ~/{model}.gguf -c {context-size} -p "{your-prompt}". Здесь -m задаёт путь к модели, -c — размер контекста, -p — промпт. Документация отмечает, что показан именно llama-cli, но подойдут и другие исполняемые файлы из каталога examples.
Для ADB-пути команда отличается: после перехода в /data/local/tmp/llama.cpp запуск идёт как LD_LIBRARY_PATH=lib ./bin/llama-simple -m {model}.gguf -c {context-size} -p "{your-prompt}". Разница в том, что здесь используется llama-simple, а путь к библиотекам задаётся переменной окружения.
Готовый промпт для первого запуска — проверка связности ответа на русском:
Ты — локальный ассистент на телефоне. Ответь кратко и по делу на русский запрос.
Запрос: [ваша тема]
Формат: три предложения, без списков и без вступлений.
В промпте меняются [ваша тема] и требования к формату. Дополнительные варианты той же задачи:
Перескажи [текст] тремя предложениями на русском, сохранив все числа.
Составь план из пяти шагов по теме [ваша тема], каждый шаг — одна строка.
Задай мне три уточняющих вопроса по теме [ваша тема] и дождись ответа.
Объясни [термин] так, как объяснил бы школьнику: коротко, на русском.
Сократи [текст] вдвое, сохранив смысл и порядок абзацев.
Найди в [текст] противоречия и перечисли их одной строкой каждое.
Если ответ приходит, движок работает. Если терминал завершается, документация указывает на размер контекста как на первую причину: значение 4096 выбрано как стартовое.
Офлайн-режим и скорость генерации
Офлайн-режим обеспечивается самой схемой работы: модель лежит файлом на устройстве, запрос уходит в локальный процесс, сеть для генерации не нужна. Документация llama.cpp описывает запуск через Termux и через ADB как работу с локальными бинарниками и локальным GGUF-файлом. Приложение Arm AI Chat из Google Play упоминается в документации как готовый продукт с системными промптами и бенчмарками.
Скорость генерации зависит от CPU и от размера контекста. Документация llama.cpp не приводит таблицы токенов в секунду, поэтому замер делается самостоятельно: запустите один и тот же промпт дважды, зафиксируйте время до последнего токена, затем уменьшите контекст и повторите. Разница покажет, сколько стоит контекст. Дополнительный ориентир — аппаратное ускорение: биндинг поддерживает SME2 для Arm и AMX для x86-64 и автоматически подбирает совместимые ядра, что влияет на скорость без ручной настройки.
Для проверки офлайн-режима включите авиарежим и повторите запрос. Если ответ приходит, сеть в цепочке не участвует. Для проверки стабильности прогоните несколько запросов подряд и посмотрите, не растёт ли потребление памяти. На устройствах с ограниченным ОЗУ документация допускает работу, но запас памяти остаётся главным ограничением.
Собственный прогон редакции по этому веб-корпусу: скачали подборку результатов веб-поиска по запросу «Llama cpp Android: как запустить модель на телефоне»: текст отдали 6 из 10. Медиана объёма читаемого текста топа — 1285 слов. Метку 2026 года несут 4 из 6 прочитанных страниц.
Частые вопросы
Llama cpp android — это официальная поддержка Android?
Да, в репозитории проекта llama.cpp есть отдельный документ docs/android.md, который описывает Android как поддерживаемую платформу. Документация перечисляет три пути сборки: GUI-биндинг через Android Studio, CLI в Termux и кросс-компиляцию через Android NDK. Отдельно указана аппаратная поддержка вплоть до SME2 для Arm и AMX для x86-64.
Нужен ли root на телефоне?
Для Termux root не требуется: документация прямо указывает, что это терминальный эмулятор с Linux-окружением без root-прав. Пакет распространяется экспериментально через Google Play, а также напрямую из репозитория проекта и на F-Droid. Для ADB-пути доступ к /data/local/tmp зависит от настроек устройства.
Какую модель выбрать для телефона?
Документация llama.cpp не приводит таблицы соответствия моделей и объёмов памяти. Ориентир — размер файла GGUF и свободное ОЗУ: файл должен укладываться в память с запасом на контекст. Документация советует скачивать модель с Hugging Face и размещать в домашнем каталоге ~/ для лучшей производительности.
Почему терминал завершается при запуске?
Документация называет вероятную причину: слишком большой размер контекста. Значение -c рекомендуется начинать с 4096, иначе потребление памяти подскакивает и терминал завершается. Второй шаг — взять файл GGUF меньшего размера или закрыть фоновые приложения.
Работает ли модель без интернета?
Да, схема работы локальная: GGUF-файл лежит на устройстве, запрос обрабатывает локальный процесс. Документация описывает запуск через Termux и через ADB как работу с локальными бинарниками и локальным файлом модели. Для проверки включите авиарежим и повторите запрос.
Для продолжения разбора локальных моделей пригодятся материалы блога: Gemma или Qwen: сравнение локальных моделей и llama.cpp API: как запустить llama-server и подключиться.
