Привет, Хабр! Эта статья является смесью инструкции и личного опыта по работе с 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, дав ему проверить файл на страшные и злобные вирусы!