Termux давно стал удобной средой для разработки на мобильных устройствах: редакторы, менеджеры пакетов, сборка проектов и запуск утилит прямо в Android-системе. Отдельный интерес представляет разработка на Rust, где важны повторяемые сборки, поддержка нескольких целевых архитектур и предсказуемое окружение для компилятора и линкера.
В этой статье рассмотрим практический подход к разработке и кросс‑компиляции Rust‑приложений в Termux с использованием cargo-cross и мульти‑таргетных образов. Под «мульти‑таргетными» подразумеваются контейнеры/образы, внутри которых уже подготовлены необходимые инструменты и наборы целевых архитектур. Это позволяет сократить время на подготовку инфраструктуры и уменьшить число «ручных» проблем с линкованием.
Подготовка Termux и базовые требования
Перед началом убедитесь, что у вас есть:
- Установленный Termux и доступ к сети (для загрузки зависимостей и образов).
- Обновлённые системные пакеты.
- Возможность запускать контейнеры/образы, которые использует
cargo-cross(обычно это Docker или совместимый движок в зависимости от вашей конфигурации Termux-среды).
Выполните базовую подготовку пакетов:
pkg update -y && pkg upgrade -yДалее установите необходимые пакеты окружения для работы с Rust и контейнерами. Состав пакетов может отличаться в зависимости от вашей конфигурации, но обычно потребуются:
pkg install -y git curl ca-certificates tar clang pkg-configДля Rust можно использовать официальный установщик через rustup (удобно для управления версиями), либо ставить через системные пакеты, если они поддерживают нужную конфигурацию. На практике чаще используют rustup:
curl --proto '=https://' --tlsv1.2 -sSf https://sh.rustup.rs | shПосле установки не забудьте активировать среду (часто достаточно перезапустить shell, либо выполнить:
source $HOME/.cargo/envПроект на Rust в Termux: старт и структура
Создадим минимальный Rust-проект, чтобы проверить сборку:
cargo new hello-cross --binПерейдите в каталог проекта:
cd hello-crossСоберите для текущей платформы:
cargo buildЕсли сборка проходит, значит базовый toolchain работает корректно в Termux. Следующий шаг — подготовка к кросс‑компиляции через cargo-cross.
cargo-cross: что он даёт и почему это удобно
cargo-cross решает типовые задачи кросс‑компиляции:
- Автоматизирует использование контейнерных образов с нужными инструментами.
- Поддерживает работу с различными целевыми платформами через
--target. - Снижает количество «зоопарка» библиотек, линкеров и настроек на стороне Termux.
Обычно workflow выглядит так: вы задаёте целевой target, а cargo-cross подбирает подходящий образ и запускает сборку внутри него.
Установка cargo-cross
Установите cargo-cross через Cargo:
cargo install cargo-crossПосле установки проверьте, что утилита доступна:
cargo cross --versionМульти‑таргетные образы: концепция и подход
В контексте кросс‑компиляции важно, чтобы набор инструментов (компилятор, линкер, системные заголовки, зависимости) был согласован с выбранной архитектурой и ОС. Вместо ручной подготовки окружения под каждый target удобнее использовать образы, которые уже содержат необходимые компоненты.
Под «мульти‑таргетными образами» мы подразумеваем подход, когда вы заранее подготавливаете несколько target’ов внутри одной логики сборки (или используете наборы образов, покрывающие разные target’ы), чтобы на этапе сборки не приходилось заново собирать окружение.
Практически это означает два варианта:
- Вариант А: использовать готовые образы, предоставляемые
cargo-cross(минимум инфраструктуры, максимум удобства). - Вариант Б: собрать и настроить собственные образы (контейнеры), если вам нужны специфические версии библиотек, патчи или кастомные зависимости.
Сборка под несколько target’ов
Перечень поддерживаемых target’ов зависит от используемых образов. На практике удобно начать с наиболее вероятных:
aarch64-linux-androidarmv7-linux-androideabix86_64-unknown-linux-gnu(если у вас задачи для Linux-платформ)
Выполните сборку для заданного target через cargo cross. Пример (подставьте нужный target):
cargo cross build --target aarch64-linux-androidЕсли вам нужно сделать релизную сборку:
cargo cross build --release --target aarch64-linux-androidАналогично для другого target:
cargo cross build --release --target armv7-linux-androideabiТаким образом вы получаете бинарники под разные архитектуры без ручной возни с окружением на стороне Termux.
Частые проблемы: зависимости, линковка и features
В реальных проектах кросс‑компиляция обычно упирается в зависимые библиотеки и особенности линковки. Вот типовые причины ошибок:
- Использование crates с нативными компонентами (FFI, bindgen, сборка C/C++ и т.п.). Нужные инструменты должны быть доступны внутри образа.
- Особенности features: некоторые crates могут включать платформозависимый код по фичам. Проверьте
[features]и условную компиляцию. - Статическая/динамическая линковка: поведение может отличаться в зависимости от образа и target’а.
Практическое правило: если проект собирается нативно на вашем текущем окружении, но ломается в контейнере, внимательно смотрите логи cargo cross — обычно там видно, какого именно инструмента/библиотеки не хватает.
Рекомендации по настройке Cargo.toml для кросс‑компиляции
Чтобы сделать проект стабильнее в разных средах, используйте:
- Минимально нужные зависимости в целях, где они не требуются.
- Условную компиляцию через
cfgдля платформо-зависимого кода. - Явное указание версий для критичных зависимостей, чтобы избежать несовместимостей.
Пример структуры (показателен, а не универсален):
[dependencies]
# выбирайте зависимости с учётом поддержки target'ов
# и не забудьте про features, если они нужны
[features]
default = ["serde"]
serde = ["dep:serde"]Сборка артефактов и организация выходных файлов
При кросс‑компиляции удобно заранее продумать, куда складывать результаты, чтобы вы могли быстро собирать релизный набор.
Обычно бинарники оказываются в директории вида:
target/<target>/release/Для удобства можно использовать скрипт и перемещать артефакты в папку dist. Например, для двух target’ов:
mkdir -p dist/aarch64-linux-android dist/armv7-linux-androideabi
cp target/aarch64-linux-android/release/hello-cross dist/aarch64-linux-android/
cp target/armv7-linux-androideabi/release/hello-cross dist/armv7-linux-androideabi/Итог — аккуратный релизный набор под разные архитектуры.
Кастомные мульти‑таргетные контейнеры: когда это нужно
Готовые образы обычно закрывают большинство случаев. Однако кастомный подход оправдан, если:
- Нужны специфические версии библиотек (например, OpenSSL/SQLite и аналоги, зависящие от задач).
- Требуются патчи, включающие/выключающие определённые компоненты.
- Проект использует нестандартные инструменты сборки нативных зависимостей.
Если вы идёте по пути кастомных контейнеров, важно, чтобы ваша версия toolchain, системных заголовков и линкера соответствовала выбранному target’у. Иначе вы получите неочевидные ошибки линковки или несовместимость ABI.
Локальная тестовая сеть и запуск в контролируемой среде
Если вам нужно тестировать сборки на других устройствах в вашей собственной инфраструктуре, используйте локальную сеть (например, через VPN с целью создания локальной сети) и передавайте артефакты на целевые устройства. Это помогает не смешивать среду тестирования с процессом сборки и делает проверки повторяемыми.
Пример полного цикла: от проекта до набора релизных бинарников
Ниже — пример последовательности действий (адаптируйте под ваши target’ы):
- Создать проект и убедиться, что базовая сборка работает.
- Поставить
cargo-cross. - Собрать release для каждого target.
- Собрать артефакты в
dist.
cd hello-cross
cargo install cargo-cross
cargo cross build --release --target aarch64-linux-android
cargo cross build --release --target armv7-linux-androideabi
mkdir -p dist/aarch64-linux-android dist/armv7-linux-androideabi
cp target/aarch64-linux-android/release/hello-cross dist/aarch64-linux-android/
cp target/armv7-linux-androideabi/release/hello-cross dist/armv7-linux-androideabi/Заключение
Разработка Rust‑приложений в Termux и кросс‑компиляция с использованием cargo-cross — это практичный способ ускорить сборки и повысить повторяемость результата. Использование мульти‑таргетных образов (готовых или кастомных) снижает риски, связанные с окружением: исчезает необходимость вручную подбирать линкеры, системные библиотеки и корректные версии toolchain под каждую архитектуру.
Если вам нужна помощь с подбором target’ов, настройкой контейнеров/образов, интеграцией нативных зависимостей или подготовкой CI для релизных сборок под несколько платформ — обращайтесь в РыбинскЛАБ. Мы поможем организовать процесс разработки и кросс‑сборки Rust под ваши реальные требования.