Привет, Хабр! Эта статья является смесью инструкции и личного опыта по работе с Buildozer.
Глава 1. А что это за зверушка такая?
Buildozer сначала может показаться просто модулем, где ты выполнил пару команд и у тебя всё заработало. К счастью или сожалению это не так. Это не просто модуль, а целая сборка из модулей под все случаи жизни, связанные с компиляцией python в apk. В стандартной комплектации присутствует поддержка архитектур arm64-v8a и armeabi-v7a.
arm64-v8a - 64 битный формат. Используется на ± всех телефонах. Даже на Unisoc.
armeabi-v7a - старый 32 битный формат. Ну тут понятно, что использоваться он будет на крайне древнем железе.
В статье я акцентирую внимание на arm64-v8a, Т.К. Мой телефон на 64 битной архитектуре. Для перехода с x64 на x32 достаточно будет поменять одну переменную. Об этом далее.
Buildozer прекрасно работает с python 3.11, но на версии выше 3.12 у меня его запустить не получилось, из-за несовместимости некоторых библиотек, которые не были пока портированы на python 3.12, так что это можно воспринимать как техническое ограничение.
Глава 2. Что прям важно знать, чтобы оно работало.
1. Структура.
У программы есть три ключевые точки, с которыми придётся работать: папка ~/.buildozer в домашней директории, папка ./.buildozer в локальной папке проекта - это структура Buildozer и ./buildozer.spec - конфигурационный файл.
В домашней папке будет храниться android SDK, NDK и другие программы, которые ему нужны (gradle он всё же будет хранить как библиотеку в папке для установки. У меня /snap/bin/gradle). Конфигурационный файл buildozer.spec хранит настрйки необходимык для сборки.
В данной статье я расскажу лишь про самые основные флаги, что бы получить работоспособную apk программу. На этот раз не буду зарекаться о продолжении, так что пока переводим основную документацию.
2. Как должен быть устроен .spec.
Обязательно проверьте, что в базовом сгенерированном файле есть строки
p4a.python_version = 3.11 requirements = python3==3.11.16, hostpython3==3.11.16, kivy, pyjnius, requests, certifi, chardet, filetype, idna, six, urllib3
Должна быть строго указана нужна версия python, иначе вы потратите минут 20 впустую.
.spec содержит в себе следующие обязательные флаги:
[app] # Название программы. title = My Application # имя пакета. package.name = myapp # Указываем доменное имя сайта(который у вас есть конечно-же) для безопасности android. Если своего домена нет, можно использовать заглушку вроде org.test или com.example. Google Play при публикации потребует уникальный домен, но для локальной сборки и тестов это не имеет значения. package.domain = org.test # указываем директорию в которой будем работать. source.dir = . # с какими расширениями файлов работаем. source.include_exts = py,png,jpg,kv,atlas # версия приложения. version = 0.1 # настройка используемым библиотек. requirements = python3==3.11.16, hostpython3==3.11.16, kivy, pyjnius, requests, certifi, chardet, filetype, idna, six, urllib3 # указание версии python к которой следует обращаться p4a.python_version = 3.11 #тип ориентации. сейчас вертикальная. orientation = portrait # работаем в полноэкранном режиме fullscreen = 0 # архитектура. По умолчанию их будет две. Уберите одну и оставьте подходящую. android.archs = arm64-v8a # работа с бэкапами(в принипе можно отрубить и всё будет ок) android.allow_backup = True [buildozer] # Уровень логирования(0=откл. 1=стандарт. 2=дебаг.) log_level = 2 # предупреждать о том, что приложение использует root (в современных системах с их "БЕЗОПАСНОСТЬЮ" необязательно.) warn_on_root = 1
3. А что библиотеки?
Основной библиотекой для вывода графики будет kivy. Она… немного специфична. Чем то на pyqt6 похоже.
В остальном обязательным являются лишь те библиотеки, которые я перечислял выше. Так же можно использовать любые библиотеки, которые не содержат C/C++ вставок, иначе вам самим предётся писать рецепт для их сборки (я пока не знаю как это делать).
Глава 3. Сборка.
Для начала вот тестовый код:
from kivy.app import App from kivy.uix.label import Label class MyApp(App): def build(self): return Label(text='Проснись Нео... Тук-тук!') if __name__ == '__main__': MyApp().run()
Просто пустое окно с энным текстом.
Создайте папку для своего проекта. Пусть будет my_app. Затем перейдите в папку и там создайте файл main.py
mkdir ./my_app cd ./my_app touch ./main.py
Для работы рекомендую использовать conda. Как установить её, можно посмотреть в замечательной статье: https://pythonru.com/baza-znanij/ustanovka-anaconda-v-os-linux
создадим среду обитания python.
conda create -n <ИМЯ ПРОЕКТА> python=3.11.16 conda activate <ИМЯ ПРОЕКТА>
Далее установим Buildoizer.
sudo apt update sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses-dev cmake libffi-dev libssl-dev ccache pip install buildozer cython
Затем надо инициализировать Buildoizer, появится файл buildozer.spec.
buildozer init
Убедитесь, что все настройки и флаги выставленны правильно.
Затем убедившись в правильности версии python, запускаем компиляцию и ждём… ждём… ждём…
buildozer android debug
Компиляция будет длиться где-то минут 20, у вас может дольше или быстрее. В начале при скачивании android SDK и NDK вам потребуется принять политику (просто вбить Y, когда попросят). Политика в принципе стандартная, но лучше прочитайте. Затем идём и завариваем чай с Кальвадосом.
Чай это САМАЯ ВАЖНАЯ составляющая всей сборки! Если вы бдительно смотрите за компилятором, то он падает по той или иной причине. Стоит отойти за чаем или кофе и всё компилится. Предположение такое: на компилятор воздействет эффект наблюдателя и влияет на его работу.
Если серьёзно, то когда он упадёт, он сразу даст в первой тысяче строк причину падения. Если это произошло - смотрите внимательно проичину и гугли, дипсикуй, стэковерфлойвь и джи-пи-туй.
После успешной компиляции у вас появится файл ./bin/myapp-0.1-arm64-v8a-debug.apk его уже можно ставить на телефон. Не забудьте успокоить систему безопасности android, дав ему проверить файл на страшные и злобные вирусы!

