Kivy на Android: от кода до готового APK

Ошибка Command failed: ./gradlew assembleDebug при сборке Kivy-приложения под Android почти всегда означает одно из двух: не установлены нужные версии SDK/NDK либо в buildozer.spec не указаны зависимости, которые ваш код импортирует. Проверка начинается не с переустановки всего toolchain, а с чтения последних 30–40 строк лога — именно там Gradle сообщает реальную причину сбоя.

Kivy — это кроссплатформенный фреймворк на Python, который позволяет написать приложение один раз и запустить его на Windows, Linux, macOS, iOS и Android. Для мобильной платформы Google код упаковывается в APK или AAB через инструменты Buildozer или p4a (python-for-android). Ниже разберём весь путь: от подготовки окружения до установки готового пакета на смартфон и диагностики типичных проблем.

Как Kivy-приложение попадает на Android

Android не исполняет Python-код напрямую: система работает с Java/Kotlin-приложениями. Поэтому при сборке в APK встраивается интерпретатор Python, библиотека SDL2 (через неё Kivy рисует интерфейс и обрабатывает касания) и сами ваши скрипты. Всё это связывается загрузчиком, который при старте запускает main.py.

Из-за такой архитектуры размер даже пустого приложения получается заметным — обычно десятки мегабайт, потому что внутри лежит целый рантайм. Это нормально и не является признаком ошибки сборки.

Подготовка окружения для сборки

Buildozer официально работает на Linux. На Windows потребуется WSL (Windows Subsystem for Linux), на macOS сборка под Android тоже возможна, но чаще встречаются конфликты зависимостей. Самый воспроизводимый вариант — Ubuntu в WSL2 или отдельная Linux-машина.

Минимальный набор действий выглядит так:

  • 🐧 Установите Python 3 и пакетный менеджер pip, затем выполните pip install buildozer.
  • ☕ Поставьте JDK — Buildozer подскажет нужную версию при первом запуске, если её нет.
  • 📦 Установите системные зависимости: git, zip, unzip, autoconf, libtool и библиотеки для компиляции C-расширений.
  • 📱 При первой сборке Buildozer сам скачает Android SDK, NDK и необходимые инструменты — потребуется стабильный интернет и свободное место на диске (несколько гигабайт).
⚠️ Внимание: первая сборка может занять от 15 минут до часа и более — скачиваются SDK, NDK и компилируются нативные библиотеки. Не прерывайте процесс: повторный запуск продолжит с места остановки, но обрыв на этапе распаковки архивов иногда оставляет повреждённые файлы, которые потом приходится удалять вручную из каталога ~/.buildozer.

Настройка buildozer.spec

Файл buildozer.spec создаётся командой buildozer init в папке проекта и управляет всей сборкой. Ключевые параметры, которые стоит проверить в первую очередь:

  • 📝 title и package.name — отображаемое имя приложения и идентификатор пакета вида org.example.myapp.
  • 📂 source.include_exts — какие файлы попадут в APK (по умолчанию часть расширений исключена, и медиафайлы могут «потеряться»).
  • 🧩 requirements — здесь перечисляют python3,kivy и все сторонние библиотеки, которые импортирует проект.
  • 🔐 android.permissions — разрешения вроде INTERNET или CAMERA, без них функции приложения будут молча не работать.
  • 📐 orientation и fullscreen — ориентация экрана и полноэкранный режим.

Отдельного внимания заслуживает список requirements. Чисто питоновские пакеты обычно подключаются без проблем, а вот библиотеки с C-расширениями (например, numpy, Pillow) требуют специальных «рецептов» сборки в python-for-android. Если рецепта нет, пакет придётся заменять аналогом или писать рецепт самостоятельно.

Пошаговая сборка APK

Когда окружение готово и spec-файл заполнен, сборка сводится к одной команде, выполняемой из каталога проекта:

buildozer -v android debug

Флаг -v включает подробный вывод — без него диагностировать сбой почти невозможно. Готовый файл появится в подкаталоге bin/ с именем вида myapp-0.1-arm64-v8a-debug.apk.

☑️ Проверка перед первой сборкой

Выполнено: 0 / 5

Для установки на подключённое по USB устройство с включённой отладкой используется команда:

buildozer android debug deploy run

Если ADB не видит смартфон, проверьте, что в настройках разработчика на устройстве включена отладка по USB, а на запрос о доверии компьютеру дан ответ «разрешить». Кабель тоже бывает причиной — некоторые шнуры передают только питание.

Типичные ошибки и их диагностика

Большинство проблем при работе Kivy на Android укладывается в несколько повторяющихся сценариев. Сводная таблица поможет быстро сориентироваться:

СимптомВероятная причинаЧто проверить
Сборка падает на этапе GradleКонфликт версий SDK/NDK или нехватка памятиХвост лога сборки, свободную RAM и диск
Приложение закрывается сразу после запускаОшибка в Python-коде или отсутствует модульВывод adb logcat с фильтром по python
Не работает сеть/камера/файлыНе объявлены разрешенияСекцию android.permissions в spec
Не находятся картинки или шрифтыРасширения не включены в APKПараметр source.include_exts
ImportError для сторонней библиотекиНет рецепта сборки под AndroidСписок поддерживаемых рецептов p4a

Главный инструмент диагностики падений на устройстве — logcat. Подключите смартфон и выполните adb logcat | grep python (или откройте полный лог и найдите traceback). Kivy выводит стандартный питоновский стек ошибки, который читается так же, как на ПК.

⚠️ Внимание: приложение, собранное в режиме debug, нельзя публиковать в Google Play — для магазина требуется release-сборка, подписанная вашим ключом, и формат AAB вместо APK. Потерянный ключ подписи невозможно восстановить: обновления приложения придётся публиковать как новое. Храните keystore и пароли от него в нескольких надёжных копиях.
📊 На каком этапе у вас возникли сложности с Kivy на Android?
Установка Buildozer и окружения
Ошибки при сборке APK
Приложение падает при запуске
Не работают разрешения или функции
Публикация в Google Play

Ограничения Kivy на мобильной платформе

Фреймворк рисует интерфейс собственными средствами через OpenGL, поэтому виджеты не выглядят как нативные элементы Android. Для более привычного Material-стиля существует библиотека KivyMD, но и она остаётся отрисовкой поверх SDL, а не системными компонентами.

Производительности хватает для бизнес-утилит, списков, форм и несложной графики. Для тяжёлых 3D-игр или интенсивной обработки видео Python-стек уступает нативной разработке. Также учитывайте ограничения фоновой работы: Android агрессивно выгружает процессы, и для фоновых задач нужен отдельный сервис — python-for-android умеет их создавать, но настройка заметно сложнее обычного приложения.

Альтернатива Buildozer — p4a напрямую

Инструмент python-for-android можно вызывать без Buildozer, передавая параметры через командную строку: p4a apk --requirements=python3,kivy --private ./myapp --package=org.example.myapp --name MyApp. Это даёт более тонкий контроль, но требует ручного управления версиями SDK/NDK. Для первых проектов Buildozer удобнее, так как автоматизирует рутину.

Обновление и публикация приложения

Когда отладочная версия стабильно работает, переходите к релизу. Сборка выполняется командой buildozer android release, после чего APK нужно подписать своим ключом и выровнять. Ключ создаётся один раз утилитой keytool из состава JDK — параметры вроде имени и срока действия вы задаёте сами.

При каждом обновлении увеличивайте version.code в buildozer.spec — именно по этому числу Android и Google Play определяют, что пакет новее установленного. Если код версии не изменить, обновление просто не установится поверх предыдущей сборки.

Часто задаваемые вопросы

Можно ли собрать Kivy-приложение под Android на Windows без Linux?

Напрямую — нет, Buildozer требует Linux-окружение. Рабочие варианты: WSL2 на Windows 10/11, виртуальная машина с Ubuntu или облачная сборка через CI-сервисы. Через WSL2 сборка проходит штатно, но первый запуск требует времени на скачивание SDK и NDK.

Почему приложение вылетает сразу после заставки?

Чаще всего это необработанное исключение в Python-коде или отсутствующий модуль. Подключите устройство по USB и посмотрите traceback через adb logcat — там будет точная строка ошибки, как при обычном запуске скрипта.

Какой размер APK считается нормальным для Kivy?

Даже минимальное приложение весит десятки мегабайт, потому что внутри находятся интерпретатор Python и SDL2. Это ожидаемое поведение, а не признак проблемы. Уменьшить размер можно, исключив лишние файлы и собрав пакет только под нужные архитектуры процессора.

Работают ли все Python-библиотеки на Android?

Нет. Чисто питоновские пакеты обычно работают, а библиотеки с C-расширениями требуют рецепта сборки в python-for-android. Для популярных пакетов (numpy, Pillow и других) рецепты существуют, для редких — придётся искать замену.

Можно ли опубликовать debug-версию APK в Google Play?

Нет. Консоль Google Play принимает только подписанные релизные сборки в формате AAB. Потребуется создать собственный ключ подписи и собрать release-версию через Buildozer.