Как создать .apk файл с помощью buildozer в Windows?
При попытке создания файла .apk через buildozer столкнулся с проблемой, что если это делать в Windows, то не создается target android, это видно если прописать в терминале buildozer help . Если создать виртуальную машину с Ubuntu, то там этой проблемы нет, но пока не хотелось бы переходить на неё, рано ещё. Вероятно проблема из-за того, что надо установить модуль python-for-android, но он не доступен для Windows, если я правильно понял. Это моя первая попытка использования buildozer, ubuntu и виртуальных машин, так что уже мозг кипит, возможно не понимаю какой-то нюанс. Кто-нибудь знает как добавить отдельно target для android? Или установить модуль python-for-android, если дело в нём? Или может подскажете гайд, где пошагово показана работа buildozer именно для Windows? Не нашел такого гайда, а по официальной документации почему-то не выходит добиться результата. В крайнем случае — подскажите пожалуйста как еще можно создать .apk файл из python именно в Windows? Игра на pygame, если это важно. Первый скрин — терминал PyCharm в Windows, второй — в Ubuntu

Отслеживать
задан 24 фев 2023 в 16:57
335 1 1 серебряный знак 12 12 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Отвечу сам. Заодно памятка будет на будущее.
- Вместо виртуальных машин устанавливаем Windows Subsystem for Linux (WSL) — правой кнопкой на меню пуск, WindowsPowerShell (администратор), wsl —install , перезагрузка. Подробная инструкция тут.
- Переходим в папку с проектом через консоль WSL. Или открываем путь к ней в проводнике и на папке, в которой находит основной файл программы (или внутри этой папки на пустом месте), и нажимаем сочетание Shift+ПКМ. В контекстном меню добавится новый пункт «Откройте здесь оболочку Linux«, нажимаем туда.
ВАЖНО. В названии папки с main.py не должно быть пробелов. А основной файл должен называться именно main.py (можно будет изменить это требование на 5 шаге)
- Вводим команду (чтобы вставить в консоль скопированный текст нажмите в ней правую кнопку мыши):
sudo apt update
Если в конце её работы видим ошибки вроде:
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease Temporary failure resolving 'archive.ubuntu.com' W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/jammy-security/InRelease Temporary failure resolving 'security.ubuntu.com' W: Some index files failed to download. They have been ignored, or old ones used instead.
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null sudo apt update
Eесли ошибок нет, но в последней строке написано что-то вроде
4 packages can be upgraded. Run 'apt list --upgradable' to see them.
sudo apt upgrade sudo apt update
Вроде как это необязательно, но на мой взгляд лучше обновить.
- Продолжаем поочередно вводить команды отсюда:
sudo apt install -y git zip unzip openjdk-17-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev pip3 install --user --upgrade Cython==0.29.33 virtualenv export PATH=$PATH:~/.local/bin/ pip3 install --user --upgrade buildozer buildozer init
- В папке появится файл настроек, который можно редактировать хоть блокнотом, хоть IDLE. В строке с зависимостями добавьте импортируемые модули. В моем случае вместо kivy нужны pygame , pygame-menu и typing-extensions . Там же можно поменять название, автора, ориентацию и т.д. В официальной документации buildozer и python-for-android достаточно подробно описано.
# (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy requirements = python3,pygame,pygame-menu,typing-extensions
На мой взгляд этот пункт самый важный, так как у меня приложение вылетало пока я не добавил последний модуль typing-extensions . Он нужен из-за модуля pygame-menu , но на ПК и без него работает, а его добавление для андроида нигде не документируется. Чтобы это понять мне пришлось узнать что такое Android Studio, logcat, виртуальное устройство, расшифровка логов и т.д. Остальные пункты удобнее настраивать когда приложение уже запускается и можно смотреть разницу при их изменении в разных сборках. Но если накосячить тут, то запустить не получится.
Закрываем файл, сохранив изменения.
- Вводим команду для начала создания .apk файла:
buildozer android debug
В примерах регулярно советуют добавлять deploy run , но если вы не подключали заранее устройство, то не нужно этого делать. Без этих команд скомпилируется .apk файл, который уже сами скинете куда надо. В первый раз в процессе создания файла надо будет 2 раза ввести y , чтобы согласиться с условиями лицензии. Файл .apk будет в папке bin , дальше его можно скидывать на телефон или виртуальное устройство.
Лично я в buildoser.spec прописал bin_dir = /mnt/h/ЯДиск где ЯДиск- папка, автоматически синхронизирующая все содержимое с облаком. Сразу же после создания файла он оказывается в этой папке (или перезаписывает предыдущую версию) и отправляется в облако. Остается открыть облако на телефоне и запустить синхронизированный .apk для установки. Самый удобный метод без использования кабелей, что я смог придумать. Можно еще вроде Android Studio соединить с телефоном по Wi-Fi и тогда уже разворачивать приложение автоматически после сборки, но не каждый телефон поддерживает такую синхронизацию
Создание мобильных приложений на Python

Да, вы можете создавать мобильные приложения с использованием Python. Я этого не знал, но я достаточно давно заметил, что наш сайт ранжируется по запросу создание мобильных приложений на Python и мне стало интересно.
Существует несколько инструментов и фреймворков, которые помогут вам создать мобильные приложения на Python. Некоторые популярные варианты:
- Kivy: Kivy – это открытая библиотека Python для разработки многокасательных приложений. Она поддерживает платформы Android и iOS и позволяет создавать одну кодовую базу, которая может работать на обеих платформах. Kivy также имеет богатый набор элементов пользовательского интерфейса и довольно прост в изучении.
- BeeWare: BeeWare – это другой набор открытых инструментов и библиотек для создания мобильных приложений на Python. BeeWare включает набор виджетов, которые являются родными для каждой платформы, что обеспечивает внешний вид и ощущение вашего приложения как родного для Android и iOS. С помощью BeeWare вы можете написать свое приложение один раз и развернуть его на нескольких платформах.
- Chaquopy: Chaquopy – это плагин для Android Studio, который позволяет вам писать приложения для Android на Python. Он позволяет смешивать код Python и Java в одном проекте, что позволяет использовать существующие библиотеки и API Android при написании логики вашего приложения на Python.
Разберем чуть подробнее на примере Kivy. Она предоставляет инструменты и виджеты для разработки интерактивных приложений, работающих на разных операционных системах, таких как Windows, macOS, Linux, Android и iOS. Вот основные аспекты работы Kivy:
- Графический движок: Kivy использует OpenGL ES 2 (или выше) для отрисовки графики, что позволяет создавать аппаратно ускоренные и высокопроизводительные приложения. Он также предоставляет абстракцию от низкоуровневых графических вызовов, что делает работу с графикой проще для разработчиков.
- Интерфейс пользователя: Kivy предоставляет богатый набор виджетов и элементов пользовательского интерфейса (UI) для создания приложений. Виджеты в Kivy адаптивны и могут масштабироваться для различных размеров экрана и разрешений.
- События и ввод: Kivy поддерживает множество входных устройств и источников событий, таких как клавиатура, мышь, мультитач-экраны и другие. Он имеет встроенную систему событий, которая позволяет разработчикам управлять взаимодействием пользователя с приложением.
- Язык Kv: Kivy включает собственный язык разметки под названием Kv, который используется для определения пользовательского интерфейса и его свойств. Язык Kv позволяет разработчикам легко создавать сложные и гибкие интерфейсы с минимальным кодом Python.
- Кросс-платформенность: Kivy позволяет разработчикам создавать одну кодовую базу для приложения, которая будет работать на разных платформах. Это значительно снижает затраты на разработку и поддержку приложения.
Для начала работы с Kivy, вам нужно установить его с помощью pip:
pip install kivy
Затем вы можете создать свое первое приложение на Kivy, используя простой код Python:
from kivy.app import App from kivy.uix.button import Button class MyApp(App): def build(self): return Button(text='Hello, Kivy!') if __name__ == '__main__': MyApp().run()
Этот код создаст простое приложение с кнопкой и текстом “Hello, Kivy!”.
Обратите внимание, что Python может быть не лучшим выбором для всех типов мобильных приложений, особенно если вам требуется высокая производительность или широкое использование специфических для платформы API. В таких случаях вам может потребоваться использовать языки разработки нативных приложений, такие как Kotlin для Android или Swift для iOS. Однако для более простых приложений или прототипов Python может быть подходящим вариантом.
Kivy сам по себе не компилирует код Python в нативный код Android. Вместо этого Kivy использует инструмент под названием Buildozer, который автоматизирует процесс сборки Kivy-приложений для различных платформ, включая Android и iOS. Для Android Buildozer использует другой инструмент под названием Python for Android (Py4A или p4a).
Вот как Kivy и Buildozer работают вместе для компиляции приложения на Android:
- Установка Buildozer: Сначала вам нужно установить Buildozer с помощью pip:
pip install buildozer
- Создание спецификации проекта: Buildozer использует файл спецификации проекта ( buildozer.spec ) для настройки процесса сборки. Вы можете создать этот файл, запустив команду buildozer init в каталоге вашего проекта. Затем откройте файл buildozer.spec и настройте параметры в соответствии с вашим приложением.
- Компиляция приложения: Запустите следующую команду в каталоге вашего проекта, чтобы начать процесс сборки приложения для Android:
buildozer android debug deploy run
Обратите внимание, что весь код Python не компилируется в нативный код, а выполняется во встроенном интерпретаторе Python. Это может привести к более низкой производительности по сравнению с нативными приложениями Android, написанными на Java или Kotlin.
В общем вывод в том, что теоретически можно написать что угодно на чём угодно. Но если это возможно – совсем не значит, что вам следует это делать. Создание мобильных приложений на Python будет использовать несколько слоев и сторонних библиотек и кроме самых простых случаев, наверняка всегда будет работать криво.
Entrepreneur and full-stack web developer capable of multitasking and completing large-scale projects in a short period of time. Founder of moy-razmer.ru and nomadicsoft.io, large experience in e-commerce and various SaaS projects
Kivy. Сборка пакетов под Android и никакой магии

Во вчерашней статье Python в Mobile development, в которой речь шла о библиотеке KivyMD (коллекции виджетов в стиле Material Design для использования их в кроссплатформенном фреймворке Kivy), в комментариях меня попросили рассказать о процессе сборки пакета для платформы Android. Для многих этот процесс, к сожалению, был и остается чем-то из ряда магического шаманства и не подъёмным для новичков делом. Что ж, давайте разбираться, так ли на самом деле все сложно и действительно ли я маг и волшебник.

Конечно, мог бы! Итак, вы написали свой код на Python и Kivy. Что нужно для того, чтобы это можно было запустить на Android устройствах? Перейдите в репозиторий KivyMD и вы увидите, что в этой инструкции уже давно прописаны шаги, которые позволят вам собрать APK пакет:
- Загрузите XUbuntu 18.04
wget https://github.com/HeaTTheatR/KivyMD-data/raw/master/install-kivy-buildozer-dependencies.sh
chmod +x install-kivy-buildozer-dependencies.sh
./install-kivy-buildozer-dependencies.sh
Все! Теперь у вас есть виртуальная машина для сборки APK пакетов для приложений Kivy! Что дальше? Давайте, собственно, займемся сборкой тестового приложения. Создайте в домашнем каталоге вашей виртуальной машины директорию TestKivyMD с пустым файлом main.py:

Далее откройте файл main.py и напишите код нашего тестового приложения, которое будет использовать библиотеку KivyMD:
from kivy.lang import Builder from kivymd.app import MDApp KV = """ Screen: MDToolbar: title: "My firt app" elevation: 10 md_bg_color: app.theme_cls.primary_color left_action_items: [["menu", lambda x: x]] pos_hint: MDRaisedButton: text: "Hello World" pos_hint: """ class HelloWorld(MDApp): def build(self): return Builder.load_string(KV) HelloWorld().run()
Сохраните, откройте терминал в директории с файлом main.py и установите библиотеку KivyMD:
sudo pip3 install kivymd
После установки можно протестировать наш код:
python3 main.py
Результатом работы скрипта будет экран с Toolbar и одной кнопкой «Hello World»:

Дальше нам нужно создать файл спецификации buildozer.spec, который должен располагаться в той же директории, что и файл main.py:

Если вы не закрывали терминал (если терминал был закрыт, откройте его в директории TestKivyMD), введите команду:
buildozer init
Эта команда создаст дефолтный файл спецификации. Откройте его и отредактируйте:
[app] # (str) Title of your application title = KivyMDTest # (str) Package name package.name = kivymd_test # (str) Package domain (needed for android/ios packaging) package.domain = com.heattheatr # (str) Source code where the main.py live source.dir = . # (list) Source files to include (let empty to include all the files) source.include_exts = py,png,jpg,jpeg,ttf # (list) Application version version = 0.0.1 # (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy requirements = python3,kivy==1.11.1,kivymd # (str) Supported orientation (one of landscape, sensorLandscape, portrait or all) orientation = portrait # (bool) Indicate if the application should be fullscreen or not fullscreen = 1 # (list) Permissions android.permissions = INTERNET,WRITE_EXTERNAL_STORAGE # (int) Target Android API, should be as high as possible. android.api = 28 # (int) Minimum API your APK will support. android.minapi = 21 # (str) Android NDK version to use android.ndk = 17c # (bool) If True, then skip trying to update the Android sdk # This can be useful to avoid excess Internet downloads or save time # when an update is due and you just want to test/build your package android.skip_update = False # (bool) If True, then automatically accept SDK license # agreements. This is intended for automation only. If set to False, # the default, you will be shown the license when first running # buildozer. android.accept_sdk_license = True # (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64 android.arch = armeabi-v7a [buildozer] # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) log_level = 2 # (int) Display warning if buildozer is run as root (0 = False, 1 = True) warn_on_root = 0 # (str) Path to build artifact storage, absolute or relative to spec file build_dir = ./.buildozer # (str) Path to build output (i.e. .apk, .ipa) storage bin_dir = ./bin
Здесь все понятно поэтому дополнительные комментарии излишни. Почитайте внимательно дефолтную спецификацию, в ней можно указать путь к иконке, пресплеш при загрузке приложения и многое другое. Я оставил лишь то, что нам сейчас нужно для сборки нашего тестового пакета. И, собственно, запускаем процесс сборки командой в терминале:
buildozer android debug
Можете смело идти на кухню и заваривать кофе, потому что в первый раз процесс загрузки и компиляции библиотек займет очень много времени. Все последующие сборки проходят за 10-20 секунд.
Кофе выпит и самое время заглянуть в терминал:

Вуаля! Наше приложение построено! Самое время закинуть его на смартфон и запустить:
Все работает! И оказывается не все так сложно, как казалось.
Также меня спрашивали:

Ни у Flutter ни у React Native нет преимуществ перед языком разметки Kivy Language, которая позволяет создавать и позиционировать лайоуты и виджеты. Как по мне, то, как строится UI во Flutter — это самое настоящее извращение. Придумать это мог только больной на голову человек. Чтобы не быть голословным, давайте посмотрим на код Flutter и код Kivy одного и того же простейшего приложения… Выглядеть оно будет следующим образом:
import 'package:flutter/widgets.dart'; main() => runApp( Directionality( textDirection: TextDirection.ltr, child: Container( color: Color(0xFFFFFFFF), child: App(), ), ), ); class App extends StatelessWidget < @override Widget build(BuildContext context) < return Center( child: GestureDetector( // используется как обычный виджет onTap: () < // одно из свойств GestureDetector // Этот метод будет вызван, когда дочерний элемент будет нажат print('You pressed me'); >, child: Container( // нашей кнопкой будет контейнер decoration: BoxDecoration( // стилизуем контейнер shape: BoxShape.circle, // зададим ему круглую форму color: Color(0xFF17A2B8), // и покрасим его в синий ), width: 80.0, height: 80.0, ), ), ); > > class Counter extends StatefulWidget < // Изменяемое состояние хранится не в виджете, а внутри объекта особого класса, // создаваемого методом createState() @override StatecreateState() => _CounterState(); // Результатом функции является не просто объект класса State, // а обязательно State > class _CounterState extends State < // Внутри него мы наконец-то можем объявить динамические переменные, // в которых мы будем хранить состояние. // В данном случае, это счетчик количества нажатий int counter = 0; // А дальше все очень просто, мы имплементируем точно такой же метод // для отрисовки виджетов, который мы использовали в классе Stateless виджета. @override Widget build(BuildContext context) < // И тут практически ничего не изменилось с нашего последнего примера, // а то что изменилось — я прокомментировал: return Center( child: GestureDetector( onTap: () < // В момент, когда кнопка нажата, мы увеличиваем значение // перменной counter. setState(() < // setState() необходим для того, чтобы вызвать методы // жизненного цикла виджета и сказать ему, что пора обновится ++counter; >); >, child: Container( decoration: BoxDecoration( shape: BoxShape.circle, color: Color(0xFF17A2B8), ), width: 80.0, child: Center( child: Text( // выводим значение свойства counter '$counter', // чтобы следить за его изменением style: TextStyle(fontSize: 30.0), ), ), ), ), ); > >
А вот абсолютно тоже самое, но с использованием Kivy и KivyMD:
from kivy.lang import Builder from kivymd.app import MDApp KV = """ #:import get_color_from_hex kivy.utils.get_color_from_hex Screen: MDCard: MDLabel: value: 0 text: str(self.value) halign: "center" on_touch_down: self.value += 1 canvas.before: Color: rgba: get_color_from_hex("#4eaabe") Ellipse: pos: self.center[0] - dp(25), self.center[1] - dp(25) size: dp(50), dp(50) """ class HelloWorld(MDApp): def build(self): return Builder.load_string(KV) HelloWorld().run()
По-моему, вывод очевиден и не нуждается в моем комментировании…
Надеюсь, был вам полезен. Оставляю опрос на тему «Удалось ли вам построить приложение для Андроид».
Create a package for Android¶
You can create a package for android using the python-for-android project. This page explains how to download and use it directly on your own machine (see Packaging your application into APK or AAB ) or use the Buildozer tool to automate the entire process. You can also see Packaging your application for the Kivy Launcher to run kivy programs without compiling them.
For new users, we recommend using Buildozer as the easiest way to make a full APK or AAB. You can also run your Kivy app without a compilation step with the Kivy Launcher app.
Kivy applications can be released on an Android market such as the Play store, with a few extra steps to create a fully signed AAB (Android App Bundle).
The Kivy project includes tools for accessing Android APIs to accomplish vibration, sensor access, texting etc. These, along with information on debugging on the device, are documented at the main Android page .
Buildozer¶
Buildozer is a tool that automates the entire build process. It downloads and sets up all the prerequisites for python-for-android, including the android SDK and NDK, then builds an apk that can be automatically pushed to the device.
Buildozer currently works only in Linux and macOS (You can still use it on Windows via WSL), and can significantly simplify the apk build.
Please find the installation instructions here
Including the “Targeting Android” section.
Afterwards, navigate to your project directory and run:
buildozer init
This creates a buildozer.spec file controlling your build configuration. You should edit it appropriately with your app name etc. You can set variables to control most or all of the parameters passed to python-for-android.
Finally, plug in your android device and run:
buildozer android debug deploy run
to build, push and automatically run the apk on your device.
Buildozer has many available options and tools to help you, the steps above are just the simplest way to build and run your APK. The full documentation is available here. You can also check the Buildozer README at https://github.com/kivy/buildozer.
Packaging with python-for-android¶
You can also package directly with python-for-android, which can give you more control but requires you to manually download parts of the Android toolchain.
Packaging your application for the Kivy Launcher¶
The Kivy launcher is an Android application that runs any Kivy examples stored on your SD Card. To install the Kivy launcher, you must:
- Go on Google Play Store and search for Kivy Launcher from kivy org
- Click on Install
- Select your phone… And you’re done!
If you don’t have access to the Google Play Store on your phone/tablet, you can download and install the APK manually from https://github.com/kivy/kivy-launcher/releases
Once the Kivy launcher is installed, you can put your Kivy applications in the Kivy directory in your external storage directory (often available at /sdcard even in devices where this memory is internal), e.g.
/sdcard/kivy/yourapplication>
should be a directory containing:
# Your main application file: main.py # Some info Kivy requires about your app on android: android.txt
The file android.txt must contain:
title=Application Title> author=Your Name> orientation=portrait|landscape>
These options are just a very basic configuration. If you create your own APK using the tools above, you can choose many other settings.
Installation of Examples¶
Kivy comes with many examples, and these can be a great place to start trying the Kivy launcher. You can run them as below:
#. Download the `Kivy demos for Android `_ #. Unzip the contents and go to the folder `kivydemo-for-android` #. Copy all the the subfolders here to
- Run the launcher and select one of the Pictures, Showcase, Touchtracer, Cymunk or other demos…
Release on the market¶
If you have built your own APK with Buildozer or with python-for-android, you can create a release version that may be released on the Play store or other Android markets.
To do this, you must run Buildozer with the release parameter (e.g. buildozer android release ), or if using python-for-android use the —release option to build.py. This creates a release AAB in the bin directory, which you must properly sign and zipalign. The procedure for doing this is described in the Android documentation at https://developer.android.com/studio/publish/app-signing.html#signing-manually — all the necessary tools come with the Android SDK.
Targeting Android¶
Kivy is designed to operate identically across platforms and as a result, makes some clear design decisions. It includes its own set of widgets and by default, builds an APK or AAB with all the required core dependencies and libraries.
It is possible to target specific Android features, both directly and in a (somewhat) cross-platform way. See the Using Android APIs section of the Kivy on Android documentation for more details.