Как разрабатывать на Python под Android
Рассказывает Александр Тейлор, разработчик проекта Kivy
В последнее время появляется большое количество ресурсов по разработке на Python под Android. Все чаще упоминается предназначенный для этой задачи фреймворк Kivy (и его ответвления), ведь он является одним из самых проверенных временем и надежных проектов в этой области. Тем не менее, одну важную деталь незаслуженно обделяют вниманием — что вообще мы сможем делать после того, как Python станет запускаться на устройстве? Есть ли какие-то ограничения? Все ли библиотеки можно подключать? Возможно ли делать все то же, что и при написании приложения на Java? Данные вопросы волнуют многих, и они рассматриваются и решаются в рамках проекта Kivy. В этой статье я постараюсь рассмотреть наиболее интересные и важные детали.
Python-for-android
Прежде всего давайте посмотрим на то, с помощью чего Python получает возможность работать под Android — инструмент, названный, как ни странно, python-for-android. Его основная функция состоит в том, чтобы создать дистрибутив — папку проекта, содержащую все необходимое для запуска вашего приложения. А точнее, сам интерпретатор, Kivy и библиотеки, от которых он зависит: Pygame, SDL и несколько других. Также дистрибутив включает в себя загрузчик Java, отображающий OpenGL и выступающий в качестве посредника между Kivy и операционной системой. Затем вы добавляете ко всему этому свои скрипты, настройки вроде иконки и имени, компилируете с помощью Android NDK и вуаля — APK с вашим приложением готов!
И это всего лишь базовая процедура, на самом деле сгенерированный пакетный файл может включать (и включает) в себя гораздо больше. Вместе со всем прочим в APK вшивается большая часть стандартной библиотеки, а любой сторонний модуль, написанный на Python, может быть легко добавлен — все так же, как и при разработке десктоп-приложений. Добавка модулей с компилируемыми компонентами тоже не вызывает трудностей, необходимо лишь указать, как их нужно собирать. Как правило, это не представляет собой ничего сложного, достаточно лишь поставить пару галочек перед запуском процедуры сборки, хотя в редких отдельных случаях могут понадобиться дополнительные действия. Python-for-android уже включает в себя указания для компиляции таких популярных модулей, как: numpy, sqlite3, twisted и даже django!
Вышеописанные принципы лишь в общих словах объясняют, как работает python-for-android. В любой момент вы можете получить больше информации на данную тему, заглянув в документацию Kivy. Я рекомендую вам Buildozer — надстройку для python-for-android, предоставляющую собой удобный интерфейс и автоматическое разрешение некоторых зависимостей. Мы стараемся сделать так, чтобы написанная выше цепочка действий использовалась не только в Kivy, но и в других проектах. Основной процесс сборки останется таким же, но нужда в загрузчике Java отпадет, так как он необходим только для поддержки некоторых специфичных нужд фреймворка.
Обращение к Android API с помощью PyJNIus
Взаимодействие с Android API: получение информации с сенсоров, создание уведомлений, вибрация, пауза и перезапуск, да что угодно — важная часть вашего приложения. Kivy за вас позаботится об основном, но многими вещами вы захотите управлять сами. Для этого создан PyJNIus — инструмент, автоматически оборачивающий код на Java в интерфейс Python.
В качестве простого примера приведем программу, которая заставит телефон вибрировать на протяжении 10 секунд:
Если вы знакомы с Android API, то без труда заметите, что код выше очень похож на аналогичный на Java — PyJNIus просто позволяет нам обращаться к тому же API, но прямо из Python. Большая часть Android API может быть вызвана подобным образом, что позволяет достичь того же функционала, что и при разработке на Java.
Главный минус PyJNIus в том, что он требует неплохого понимания структуры Android API, а код выходит громоздким, хотя его эквивалент на Java выглядит точно так же. Для решения этой проблемы Kivy включает в себя Plyer.
Plyer: кроссплатформенное API для платформоспецифичных задач
Проект Plyer ставит себе цель создать простой «питоничный» интерфейс для функций, которые присутствуют на большинстве платформ. Например, код выше легким движением руки превращается в…
Более того, написанный код попытается выполнить свою задачу на всех поддерживаемых Plyer платформах — на данный момент это: Android, iOS, Linux, Windows и OS X (для iOS также существует аналог PyJNIus, называемая PyOBJus). На самом деле, вибрация — не самый лучший пример, потому что сейчас она реализована только для Android, но такие функции как проверка уровня заряда батареи:
— работают как в десктопных, так и в мобильных приложениях, а получение данных с компаса/гироскопа и отправка SMS без проблем реализуются на Android и iOS.
Plyer находится на начальной стадии развития, так что любая помощь в разработке приветствуется. Также, мы участвуем с ним в Google Summer of Code в этом году.
Не только ради Kivy
Все вышеперечисленные инструменты были разработаны для нашего фреймворка, но на самом деле они больше предназначены для разработки под Python в целом. В Plyer мы специально избегаем какой-либо зависимости от Kivy, а PyJNIus нужен лишь для доступа к Android JNI. Искренне надеемся, что эти инструменты станут полезны для любого, кто пишет на Python под Android. Вы уже можете попробовать PyJNIus, используя QPython. Python-for-android больше завязан на взаимодействии с Kivy, но мы будем рады обсудить этот вопрос.
Многое можно реализовать при разработке на Android с помощью Python, несмотря на все различия с Java, которая предназначена для этого, но эти возможности могут быть расширены еще больше в ближайшем будущем. И если вы заинтересовались описанными выше проектами, то самое время присоединиться к нашей команде!
Мобильная разработка на Python: обзор двух фреймворков
Мобильная разработка на Python – одно из перспективных направлений. В статье автор рассматривает два фреймворка с их недостатками и преимуществами.
Как насчёт использования Python для мобильной разработки? Исторически Python не был лучшим инструментом для написания мобильных GUI приложений.
Фактически, о разработке на Python под iOS и Android не могло быть и речи. Однако благодаря некоторым изменениям, произошедшим в последние годы, перспектива использования Python для написания мобильных приложений значительно улучшилась.
Мобильная разработка на Python постепенно прогрессирует. Результатом этого прогресса являются несколько современных инструментов, которые мы рассмотрим в этой статье. Два фреймворка, которые следует выделить — это Kivy и BeeWare.
Kivy — кроссплатформенная мобильная разработка на Python
Kivy — это библиотека Python, имеющая открытый код, предназначенная для разработки кроссплатформенных GUI приложений. Она позволяет писать вам приложения с графическим интерфейсом на чистом Python, которые работают на основных платформах (Windows, Linux, MacOS, Android, IOS).
Теперь каждый раз, когда я слышу о новом GUI toolkit, мне всегда интересно насколько «родным» для меня это будет — я считаю, что GUI приложений должен опираться на сильные стороны платформы, на которой он работает.
Например, когда я использую свой iPhone, я хочу видеть именно приложение, разработанное специально под IOS. Иногда раздражает использование приложения, которое было разработано с шаблонами пользовательского интерфейса из другой платформы.
В Kivy встроен настраиваемый набор инструментов пользовательского интерфейса, который предоставляет собственные кнопки, формы ввода текста, radiobutton’ы и т. д. Это означает, что эти виджеты не отображаются с помощью элементов управления пользовательского интерфейса собственной платформы. У этого есть свои плюсы и минусы.
С одной стороны, это гарантирует нормальное функционирование приложения на различных платформах. С другой стороны, это также означает то, что ваше приложение под Android не будет выглядеть как приложение для Android. Однако всё зависит от типа приложения, которое вы разрабатываете. Например, для большинства игр нативность пользовательского интерфейса не очень важна.
То же самое относится к определенным видам приложений, таких как графические MIDI-контроллеры для создания музыки. Но для других типов приложений это имеет огромное влияние на удобство использования.
Итак, если вы можете работать с не нативным набором инструментов пользовательского интерфейса в своих приложениях, Kivy — отличный выбор. Этот фреймворк позволяет вам писать мобильные приложения, используя свои навыки программирования на Python, без необходимости изучать другой язык для определённой платформы, например, Swift от Apple.
BeeWare Project — нативные мобильные приложения на Python
Ключевое различие между Kivy и BeeWare в том, что BeeWare использует нативный набор инструментов UI для определённой платформы. Kivy использует кастомный набор инструментов UI, который задействует те же элементы управления на всех платформах.
В BeeWare UI контроллерами будут кнопки, чекбоксы и другие форменные элементы, предоставляемые системой, под которую разработано приложение. Это означает, что вы можете создавать приложения, которые выглядят и чувствуются стопроцентно нативными для каждой мобильной и десктоп платформы.
Звучит неплохо, правда?
Единственным недостатком является то, что проект BeeWare всё ещё находится в разработке, возглавляемой Pythonista Russel Keith-Magee. Как и с любым фреймворком, который ещё не успел развиться, вы работаете в качестве разработчика из-за (потенциально частых) изменений API, ошибок и отсутствия необходимых функций.
Мобильная разработка на Python: заключение
Если перед вами встанет выбор между этими двумя фреймворками, то скажу сразу: вам стоит попробовать как Kivy, так и BeeWare. Что касается “зрелости”, то Kivy, на мой взгляд, является более “зрелым” фреймворком.
В тех случаях, когда речь идёт о создании десктопных приложений на чистом Python, я думаю, что BeeWare в конечном итоге одержит верх из-за нативных UI контроллеров.
Но, честно говоря, если вы думаете о создании крупного мобильного приложения сегодня, то не имеет смысла писать его на Python. Если вы хотите получить лучший результат и использовать самые современные функции систем, лучше всего вам подойдёт Java (Android) и Swift (IOS).
Лично я бы хотел иметь возможность писать кроссплатформенные приложения на Python просто потому, что Python – приятный язык для работы.
Итак, если вы ищете хороший фреймворк с открытым исходным кодом, рассмотрите Kivy и BeeWare.
Разработка приложения с использованием Python и OpenCV на Android устройстве
В это статье я хочу показать пример того, как андроид устройство можно использовать для разработки на таких языках программирования как python с библиотекой opencv в среде VSCode (будет использован code-server). В конце статьи приведено небольшое сравнение производительности Termux на моем Android устройстве и Raspberry Pi 3B.
Все действия описанные статье выполнялись на:
Huawei MediaPad M5 10.8
4GB ОЗУ, Hisilicon Kirin 960s, EMUI 9, без root
Для начала понадобится установить Termux (эмулятор терминала, предоставляющий возможности среды Linux), о приложении уже писали на habr.
Далее установим необходимые пакеты, а так же, для более быстрой настройки в дальнейшем, установим ssh сервер:
Теперь можно воспользоваться более удобным для ввода устройством и выполнять действия по ssh. В данной статье будет рассмотрен способ подключения с использованием логина и пароля, для этого необходимо узнать имя текущего пользователя и задать пароль:
По умолчанию openssh прослушивает порт 8022, узнать ip адрес устройства можно с помощью команды ifconfig:
Подключаемся к Termux:
Установить opencv-python в собственном окружении Termux мне не удалось, поэтому воспользуемся трудами Andronix и запустим в Termux Ubuntu 18.04.
В официальном приложением Andronix можно найти команды для установки других дистрибутивов таких как Kali, Manjaro и т.д.
Дополнение 17.11.2020. Если во время установки появляется ошибка proot, читаем комментарий, спасибо @makaedgat.
Если все выполнилось успешно на экране появится
Установим пакеты необходимые для разработки на python3 с использованием opencv:
Установка занимает довольно много времени.
Теперь установим code-server
После установки code-server необходимо отредактировать файл конфигурации
По умолчанию code-server прослушивает адрес 127.0.0.1:8080, для обращения к code-server с других устройств необходимо поменять bind-addr на 0.0.0.0:8080. Присутствует возможность авторизации по паролю. Для задания пароля необходимо изменить значение password. Для отключения авторизации необходимо указать auth: none.
Все действия в статье выполняются в Ubuntu без графического интерфейса в результате чего нет возможности использовать imshow, но есть способ транслировать видео в браузер используя библиотеку flask и специальный MIME тип multipart.
Чтобы не отвлекаться на написание кода, используемого в статье для примера, его можно взять в моем github репозитории.
При первом открытии будет предложено установить расширение Python — соглашаемся.
Установим приложение для потоковой передачи с камеры устройства, например IP Webcam. Главное требование к приложению — возможность транслировать с камеры поток понятный opencv, например rtsp. Разрешение видео потока настраиваем в зависимости от производительности устройства. На моем самое оптимальное 1280×720.
Запускаем трансляцию видео в IP Webcam и проект:
В заключение хочу отметить, что при наличии современного Android устройства его можно использовать как альтернативу raspberry pi. Так, например, сняв ограничения энергопотребления домашний планшет можно использовать как полноценный arm64 мини пк, работающий в фоне постоянно. При этом производительность у Termux вполне высокая.
Разрешение видео 1280×720
Далее несколько дополнений которые не вошли в основную статью
Для того чтобы иметь возможность обмениваться файлами между termux и android необходимо в выполнить команду
Теперь локальная память устройства примонтирована в
если ссылка не работает то руками качаем от сюда.
Разработка игры под Android на Python на базе Kivy. От А до Я: подводные камни и неочевидные решения. Часть 1
Некоторое время тому назад я решил попробовать написать что-то на Python под Android. Такой странный для многих выбор обусловлен тем, что я люблю Python и люблю Android, а ещё люблю делать необычное (ну хорошо, не самое обычное). В качестве фреймворка был выбран Kivy — фактически, безальтернативный вариант, но он мне очень понравился. Однако, по нему не так уж много информации (нет, документация отличная, но иногда её недостаточно), особенно на русском языке, а некоторые вещи хоть и можно реализовать, но их то ли никто раньше не делал, то ли не счёл нужным поделиться информацией. Ну а я счёл 🙂 И этот пост тому результатом.
Под катом я расскажу обо всех этапах разработки, о том, как развивалась простая идея и как для этого приходилось искать новые возможности, о возникших подводных камнях и багах, о неочевидных решениях и устаревшей документации 🙂 Цель — описать в одном тексте основные пункты, чтобы человеку, решившему написать что-то немного сложнее игры Pong из официального туториала, не приходилось перерывать официальный форум поддержки и StackOverflow и тратить часы на то, что делается за пару минут, если знаешь, как.
0. Если вы впервые слышите о Kivy.
… то всё зависит от того, любите ли вы Python и Android, и интересно ли вам в этом разобраться. Если нет — проще забить 🙂 А если да, то начать нужно с официальной документации, гайдов, и уже упомянутого официального туториала по игре Pong — это даст базовое представление о фреймворке и его возможностях. Я же не буду останавливаться на столь тривиальных вещах (тем более, для понимания базовых принципов туториал отлично подходит) и сразу пойду дальше. Будем считать, что это было вступление 🙂
1. Немного о моей игре
Для начала нужна была идея. Мне хотелось что-то достаточно простое, чтобы оценить возможности фреймворка, но и достаточно интересное и оригинальное, чтобы не программировать ради программирования (это здорово, но когда это не единственная цель — это ещё лучше). Я неплохо проектирую интерфейсы, но не умею рисовать, поэтому игра должна была быть простая графически, или вообще текстовая. И тут так уж сложилось, что у меня есть заброшенный сайт с цитатами, с которого я когда-то начинал свой путь в web-разработке (я о нём даже писал на Хабре много лет назад). Поэтому идея возникла такая: игра-викторина «Угадай цитату». В русскоязычном Google Play ничего подобного не было, а в англоязычном была пара поделок низкого качества с сотней скачиваний.
Почти сразу же стало понятно, что просто так отгадывать цитату за цитатой — скучно. Так появились первые «фишки», которые, в итоге, и определили итоговую игру. В первую очередь это были тематические пакеты (то есть пакеты цитат, объединённые одной темой или автором) и баллы (которые начисляются за отгадывание цитат и прохождение пакетов, и тратятся на подсказки и разблокировку новых тем), а также статистика, достижения и избранное.
Так всё начиналось (кликабельно):
Ну ладно, ладно, больше не буду показывать такой ужас 🙂 Кстати, вот так оно выглядит сейчас (тоже кликабельно, скрины взяты с Google Play):
Первые проблемы начались с первого же экрана…
2. Kivy тормоз или я что-то делаю не так?
Один мой друг любит отвечать на такие вопросы «да» 🙂 На самом деле, некоторые вещи в Kivy действительно работают медленно, например, создание виджетов. Но это не значит, что это дело нельзя оптимизировать. Об этом я и расскажу.
Так как цитаты и темы хранятся в БД, то, само собой, кнопки с пакетами генерируются динамически. И вот тут-то я обнаружил, что происходит это очень медленно: примерно полсекунды на список из 20 кнопок. Возможно, это и не очень много при загрузке приложения, но при переходе на главный экран из других внутренних экранов приложения — непозволительно много. Здесь стоит отметить, что кнопка к тому моменту уже представляла собой, на самом деле, набор из нескольких элементов, визуально составляющих одну кнопку:
Первым моим побуждением было тем или иным образом закешировать их, и, действительно, опыт показал, что если создать все виджеты заранее, и сохранить их как свойство объекта StartScreen, то всё (кроме первой генерации) работает достаточно быстро. Однако же, данные в кнопках нужно периодически обновлять (хотя бы то же количество отгаданных цитат). Да и загрузку новых пакетов я уже тогда планировал. Конечно, не проблема реализовать и это, но я решил не изобретать велосипед и подумать.
Сначала стоило убедиться, что проблема именно в создании виджетов, поэтому я за несколько минут набросал простенькое приложение на два экрана, в каждом из которых генерировался набор строк из лейбла и чекбокса количеством 50 шт. 🙂
Запустил на своём стареньком Moto G (gen3) и получил:
И далее в том же духе. Поиск по этому вопросу ничего не дал, поэтому я обратился к разработчикам. И получил ответ: «Создание виджетов относительно медленное, особенно в зависимости от того, что они содержат. Для создания больших списков лучше использовать RecycleView». Здесь хочу пояснить, почему я вообще описываю этот момент, ведь описание RecycleView есть в документации. Да, действительно, есть, но мало кто способен изучить и запомнить всю документацию перед тем, как начнёт разработку, и найти нужный инструмент бывает непросто, особенно если он нигде не описан в контексте решения конкретной проблемы. Теперь же он описан 🙂
Более чем в 100 раз быстрее. Впечатляет, не правда ли?
В завершение следует упомянуть, что RecycleView — не панацея. Он не подходит, если размер элемента зависит от содержимого (например, Label, размер которого меняется в зависимости от количества текста).
3. Сервисы. Автозапуск и перезапуск
Следующая проблема, с которой я столкнулся, не поддавалась решению так долго, что я уже малодушно подумывал счесть данный фреймворк непригодным и забить 🙂 Проблема была с сервисами (в Android так называется процессы, выполняющиеся в фоновом режиме). Создать сервис не так уж и сложно — немного сбивает с толку устаревшая документация, но и только. Однако, в большинстве случаев, много ли толку от сервиса, который, во-первых, не запускается автоматически при загрузке телефона, а во-вторых, не перезапускается, если «выбросить» приложение свайпом из диспетчера задач? По-моему, нет.
На тот момент по этой теме была всего лишь одна статья в официальной wiki, но она, хоть и называлась «Starting Kivy service on bootup», на самом деле всего лишь рассказывала, как при загрузке телефона запустить приложение, но не его сервис (да, такое тоже бывает полезно, но значительно реже, как по мне). Ту статью я, в итоге, переписал, а здесь расскажу подробности.
Допустим, у нас есть примитивный сервис, который всего-то и делает, что периодически выводит в лог строку (этим мы заранее исключаем баги, которые могут возникать из-за особенностей самого сервиса).
Из приложения мы запускаем его методом основного класса при помощи PyJnius:
Если APK собран правильно, при запуске приложения сервис будет стартовать, но этого недостаточно.
Для начала, попробуем сделать так, чтобы он перезапускался при остановке приложения (например, при снятии его из диспетчера задач). Конечно, можно было бы использовать startForeground, но это уже не совсем фоновое выполнение задачи 🙂 Для него потребуется, как минимум, уведомление — это не всегда подходит. В данном случае идеально подходит флаг START_STICKY, но мы же пишем на Python, что делает задачу не столь тривиальной — по крайней мере, при помощи PyJnius она уже не решается.
Ура, сервис рестартится. Всё? Конечно, нет 🙂 Потому что он тут же валится с ошибкой:
Проблема в функции onStartCommand(Intent intent, int flags, int startId), поскольку после перезапуска intent у нас null. Что ж, перепишем и её:
Проблема в том, что функция nativeStart() не получает нужных Extras. К сожалению, два из них мне пришлось захардкодить. В итоге выглядит это так:
Перейдём к автозапуску сервиса при запуске телефона. После предыдущей проблемы это будет уже проще. (На самом деле же всё было наоборот — я очень долго не мог понять, что именно нужно добавить, поскольку информации об этом не было вообще нигде, и сами разработчики тоже не знали, как решить данную задачу. И только разобравшись параллельно с вопросом перезапуска, я понял, что нужно сделать.)
Для начала понадобится разрешение RECEIVE_BOOT_COMPLETED — это просто. А затем — BroadcastReceiver, его придётся добавить в AndroidManifest вручную, но это тоже не проблема. Проблема в том, что в нём писать 🙂
Решение для запуска приложения (не сервиса) выглядит так:
Сначала я попытался просто переписать его для сервиса:
Думаю, вам уже понятно, что проблема в тех самых Extras. Мне же тогда об этом было узнать неоткуда. Но не буду тянуть, рабочий код выглядит так:
Локализация и мультиязычность
В целом, для локализации можно использовать gettext, или же поступить ещё проще — создать папку lang, в ней по файлу на каждый язык (например, en.py и ru.py), определить там все слова и фразы в виде переменных/констант, и далее подключить нужный модуль. Примерно так:
Статическая переменная использована для того, чтобы языковые константы было удобно использовать в kv-файле:
Мобильное приложение на Python c kivy/buildozer. Лекция в Яндексе
Не факт, что вам потребуется написать серьёзное приложение на Python. А вот быстро собрать работающий сервис, чтобы «продать» его заказчику, — почему нет? Python универсален, и опыт создания мобильного софта на этом языке может оказаться полезным. Владислав Шашков из Сбербанка рассказал о том, как строится разработка с помощью фреймворка kivy.
— Добрый день. Меня зовут Владислав Шашков, я работаю в Сбербанке и вообще-то я продуктовик, не разработчик. Именно этим может быть интересен мой доклад, потому что он наглядно покажет, что сделать мобильное приложение на Python достаточно несложно.
Kivy — все-таки он «Киви», потому что образно его изображают на обложках книжек в виде фрукта, и на русском ближе будет произношение «Киви». Фреймворк развивается с 2011 года. По сути, это графическая UI-библиотека для создания кроссплатформенных приложений, не только на мобильных платформах. Ее особенностью является язык KV, это язык разметки. Если образно попробовать описать что такое язык KV, получится, что так бы выглядел HTML, будь он написан на Python.
Также мы поговорим о библиотеке KivyMD, которая представляет из себя набор виджетов в стиле Material Design. KivyMD позволяет создавать дружелюбный гугловый интерфейс, с которым можно работать над пользовательским опытом.
Здесь на видео показано, как пролистываются все виджеты, которые есть в библиотеке. Как вы можете видеть, это достаточно богатый набор элементов. Это и закладки, и кнопки, и прогресс-бары, и всплывашки. В принципе, есть все необходимое, чтобы реализовать нужный вам клиентский опыт. Если надо будет собрать сборку на iOS, то выглядеть она будет точно так же. Тот же Material Design. В принципе, такое приложение можно опубликовать в App Store, хоть оно и будет похожее на Google.
Kivy без KivyMD имеет очень аскетичный дизайн. Его даже клиентам показывать не стоит. Похожие на убунтовские простые кнопки, простые диалоги, не адаптированные к мобильному опыту, к мобильным пользователям. А KivyMD молодцы, все красиво сделано.
Есть плохая новость. Исполняемые пакеты приложения собирает специальная утилита — buildozer. И плохая новость заключается в том, что начать пользоваться, сделать первую сборку с ее помощью совсем не просто. Как и, наверное, с любым опенсорсным ПО, чтобы все получилось, чтобы в итоге дойти до цели и получить APK, нужно пройти определенной «тропой», не сворачивая по сторонам.
На этом слайде подробно описано, что нужно делать, как пройти по «тропе» и не сделать лишнего. Не надо пытаться обновить сам kivy или какие-то другие библиотеки в образе. Все что нужно, указано на слайде, остальное само подтянется и будет работать.
Дальше немного расскажу о структуре проекта Kivy. На слайдах размещены QR-коды, где закодированы ссылки на GitHub, чтобы вы могли их сейчас считать и непосредственно проследить примеры, о которых я буду рассказывать. (Первая ссылка — прим. ред.)
На экране представлен файл buildozer spec, это спецификация на проект. Самое важное здесь: есть строка, в которой перечисляются requirements, то есть библиотеки, которые необходимы для сборки, и в ней указывать надо Kivy, KivyMD, запись там есть, и на GitHub она тоже доступна.
Важный раздел, он закомментирован, касается андроидовских NDK, SDK, его трогать не надо. Значения по умолчанию будут работать.
Немного про UI и UX. В языке разметки KV есть два понятия: виджеты и лэйауты. Виджеты — видимые элементы, кнопочки, поля ввода и тому подобное. Виджеты получают события и могут их обрабатывать. А лэйауты — это объекты, которые позволяют позиционировать виджеты, их есть несколько видов, чтобы выстроить виджеты в рядок или наоборот, как-то произвольно позиционировать. В общем-то, этот подход стандартный для визуальных UI, UX, и в других библиотеках он тоже используется.
Здесь пример языка KV (ссылка — прим. ред.). Как мы видим, вначале за решеткой идет импорт библиотек, затем в угловых скобках… Неправильно говорить «корневой», просто начальный лэйаут, которому в коде будет сопоставлен класс. Один в один названия должны совпадать. Таким образом происходит сопоставление разметки и класса в коде. Дальше через отступы идут вложенные виджеты, внутри виджетов, опять отступом идут property и события, они в одном списке идут. Вот пример кода.
Вверху класс — класс лэйаута. Дальше идет класс приложения, и внизу две строчки для загрузки константы разметки, и запуска приложения. Знаю, что аудитория, наверное, не очень знакома с мобильной разработкой, поэтому расскажу о дальнейших шагах, что конкретно надо сделать на телефоне, чтобы запустить и отладить свой APK.
Первым делом надо на телефоне включить решим разработчика. Он достаточно хитро включается. Обычно это секретная последовательность нажатий пунктов меню в режиме настроек телефона. В презентации приведена одна из распространенных последовательностей, но на вашем телефоне она может не работать. После выполнения этой последовательности действий появится режим для разработчика, и можно уже устанавливать APK, отлаживать и дальше действовать.
Buildozer запускается в виртуальной машине, виртуальную машину надо обновить, чтобы она была посвежее. После этого появиться интеграция с USB, тогда можно будет подключить телефон к виртуальной машине.
Признак того, что у вас произошло подключение — телефон спросит разрешения на отладку. Каталог проекта создается в папке /BUILD. Чтобы собрать проект, необходимо в каталоге проекта выполнить команду buildozer android debug. Установка APK на телефон выполняется утилитой из Android Studio, которая уже есть в образе, командой adb install.
И фраза success говорит, что пока все хорошо, выполнена загрузка на телефон.
Отладка кода выполняется следующим образом. Надо запустить сбор отладочной информации командой adb logcat, чтобы параллельно с приложением работал сборщик. Ваше приложение после первого запуска «с высокой долей вероятности» упадет, после чего можно останавливать отладку и идти читать файлик логов.
Как искать сообщение об ошибке? По ключевому слову python. Самая последняя запись c ключевым словом python, как правило, расскажет вам, что пошло не так.
Про то, что можно сделать на телефоне. Мобильная платформа позволяет сделать не просто кнопочки, которые к API ходят, а поработать с большим разнообразием датчиков гаджета. Для работы с мобильной периферией есть стандартная библиотека plyer. Она платформенно-независимая, то есть все, что на ней будет написано, пересоберется с Android на iOS. На слайде перечислены все доступные опции. Там и GPS, и батарея, и камера… Но с камерой plyer позволяет сделать только статический снимок.
А следующий пример как раз расширяет эту возможность. Ссылка на GitHub, пример, который позволяет получать видеопоток в приложении. У меня была бизнес-задача QR-код распознать с картинки. Также этот пример может работать с распознаванием видео, дополненной реальностью и т. п.
Еще у kivy есть пространство для пользовательских аддонов — Garden. Любой может делать виджеты и тому подобное. Полезный виджет, который я использовал, это работа с картами. Он активный, можно масштабировать, покрутить карту. Здесь показан пример, как его подключать. В Garden есть много других виджетов.
Когда я работал над своим проектом, то проводил коридорное тестирование с коллегами, чтобы собрать обратную связь об использовании приложения. И получил такие замечательные возражения, как «я левые APK не буду ставить», «мама не разрешает», «я только телефон купил». Чтобы продолжить тестирование клиентского опыта по существу, мне пришлось пройти путь создания мобильного приложения до конца, а именно сделать релиз в Google Play. На слайде он описан. Основные моменты заключаются в том, что надо с ключами повозиться, и публикация в Google Play не бесплатная. Чтобы зарегистрироваться разработчиком, надо приготовить 25 долларов. И это еще очень демократично, потому что Apple просит 99 долларов.
На данном слайде приведены ссылка на пример приложения, можно посмотреть мой проект. Это все еще альфа-прототип, поэтому прошу не судить строго, если приложение будет падать. Ссылка на актуальную документацию свежая, мне представляется, что она хорошая. Есть комьюнити, группа ВКонтакте, ее админ на Хабре периодически статьи выпускает.