Python для мобильной платформы Android: от идеи до работающего приложения
Python в экосистеме Android: обзор подходов
Основное эффективное решение для создания графических приложений на Python под Android - связка Kivy + Buildozer.
Kivy - это кроссплатформенная библиотека для создания мультитач-интерфейсов. Buildozer автоматизирует сборку APK, упаковывая интерпретатор CPython, библиотеки и ваш код. Этот подход даёт полный контроль над интерфейсом и не требует знания Java/Kotlin.
Как создать простое приложение с кнопкой и вывести его на Android?
Сначала установите Python и pip на ПК. Затем установите Kivy и Buildozer:
pip install kivy buildozerкод python на андроид (код python на android)
Создайте директорию проекта и файл main.py:
from kivy.app import App
from kivy.uix.button import Button
class SimpleApp(App):
def build(self):
return Button(text='Нажми меня!')
SimpleApp().run()Теперь инициализируйте Buildozer: buildozer init. В файле buildozer.spec отредактируйте название приложения, домен, версию. Убедитесь, что строка requirements содержит python3,kivy. Скомпилируйте APK:
buildozer android debug deploy runНа устройстве появится приложение с кнопкой.
Типичные ошибки и их решения
- Ошибка сборки из-за отсутствия зависимостей: в
buildozer.specукажите все нужные библиотеки через запятую. Например,requirements = python3,kivy,requests. - APK получается слишком большим: используйте
android.reduce_package = Trueи исключите ненужные библиотеки. - Приложение вылетает при запуске: добавьте в
buildozer.specandroid.log_level = 2и просмотритеlogcat.
Как запускать произвольные Python скрипты на Android без ПК?
Для выполнения скриптов и экспериментов подойдёт Termux - терминальный эмулятор с менеджером пакетов. Установите Termux через F-Droid (Play Store версия устарела). Затем:
pkg update && pkg upgrade
pkg install python
pip install flask # пример установки библиотекиСоздайте скрипт hello.py:
print("Привет из Termux!")Запустите: python hello.py. Таким образом можно запускать Flask-сервер, ботов, обработку данных.
Возможные проблемы:
- Не устанавливаются некоторые бинарные пакеты (например, numpy): используйте
pkg install python-numpy. - Нет доступа к внешнему хранилищу: выполните
termux-setup-storage. - Приложение закрывается после выхода: используйте
termux-wake-lockдля фоновой работы.
Как встроить Python код в существующее нативное Android приложение?
Chaquopy - Gradle-плагин, который позволяет вызывать Python из Java/Kotlin. Подходит для интеграции алгоритмов машинного обучения, скриптов обработки данных. В файле build.gradle (на уровне проекта) добавьте:
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.chaquo.python:gradle:15.0.1'
}
}В app/build.gradle примените плагин и укажите Python-модули:
apply plugin: 'com.chaquo.python'
android {
defaultConfig {
python {
buildPython "/usr/bin/python3"
pip {
install "numpy"
}
}
}
}Разместите Python-файлы в app/src/main/python. Например, mymodule.py:
def add(a, b):
return a + bВ Kotlin-коде Activity вызовите функцию:
val py = Python.getInstance()
val module = py.getModule("mymodule")
val result = module.callAttr("add", 3, 4)
Log.d("Result", result.toString()) // 7Сложности:
- Поддерживаются не все нативные библиотеки. Перед включением проверяйте совместимость. Для работы с OpenCV используйте отдельную настройку.
- Большой размер APK. Используйте
python.minimal = trueв конфигурации Gradle.
Как быстро протестировать Python-код на Android с готовой IDE?
Pydroid - среда разработки для Android с интерпретатором, редактором и менеджером пакетов. Установите Pydroid из Google Play. Создайте новый файл и напишите:
import requests
response = requests.get('https://api.github.com')
print(response.status_code)Нажмите «Run». Pydroid сам загрузит requests при необходимости. Идеально для быстрых экспериментов, изучения Python, автоматизации на устройстве.
- Бесплатная версия ограничена по функционалу. Для работы с графикой (OpenCV, Kivy) требуется покупка.
- Ошибка загрузки pip-пакетов: проверьте настройки прокси или используйте зеркала PyPI.
Как создать кроссплатформенное приложение на Python с единой кодовой базой?
BeeWare с набором инструментов Toga предоставляет нативные виджеты для Android. Установите briefcase:
pip install briefcaseСоздайте проект: briefcase new, выберите Toga GUI. В app.py определите интерфейс:
import toga
def button_handler(widget):
print("Нажата кнопка")
def build(app):
box = toga.Box()
button = toga.Button('Жми', on_press=button_handler)
box.add(button)
return box
app = toga.App('MyApp', 'com.example.myapp', startup=build)
app.main_loop()Для Android используйте briefcase create android и briefcase build android. Результат - APK с нативным интерфейсом.
- Медленная работа на старых устройствах. Toga пока не оптимизирован для сложных интерфейсов.
- Неполная поддержка некоторых виджетов Android - например, кастомные списки.
Расширенные примеры кода Python на Android
1. Веб-сервер Flask на Android через Termux
Пример запуска локального сервера с отдачей динамических данных. Установите Flask в Termux (pip install flask). Создайте файл server.py:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return jsonify({"message": "Сервер работает на Android", "device": "Termux"})
@app.route('/echo', methods=['POST'])
def echo():
data = request.get_json()
return jsonify(data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=False)Запустите python server.py. Результат вывода:
* Serving Flask app 'server' * Running on http://0.0.0.0:8080
Теперь любое устройство в той же сети может обратиться по http://<IP-телефона>:8080. Для проверки используйте curl внутри Termux: curl http://localhost:8080/ - вернёт {"message": "Сервер работает на Android", "device": "Termux"}.
2. Захват видео с камеры через OpenCV в Pydroid
Установите Pydroid Pro (поддерживает OpenCV). Создайте скрипт camera.py:
import cv2
cap = cv2.VideoCapture(0) # 0 - задняя камера
if not cap.isOpened():
print("Не удалось открыть камеру")
exit()
while True:
ret, frame = cap.read()
if not ret:
break
# Отображаем зеркально
frame = cv2.flip(frame, 1)
cv2.imshow('Android Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()Запустите в Pydroid. На экране появится окно с видеопотоком (скриншот окна приложения). Результат - непрерывный показ изображения с камеры. Важно: для выхода нажмите q.
3. Вызов Python из Android Activity через Chaquopy
Расширенный пример с передачей строк и обработкой массива. Python-модуль dataprocess.py:
def sum_and_count(numbers):
"""Возвращает сумму и количество элементов."""
return {"sum": sum(numbers), "count": len(numbers)}
def upper(text):
return text.upper()В коде Kotlin (Activity) используйте Python.getInstance() для вызова:
val py = Python.getInstance()
val module = py.getModule("dataprocess")
// Вызов с целыми числами
val nums = listOf(1, 2, 3, 4)
val result = module.callAttr("sum_and_count", nums)
Log.d("Sum", result.get("sum").toString()) // 10
Log.d("Count", result.get("count").toString()) // 4
// Вызов со строкой
val upperResult = module.callAttr("upper", "chaquopy")
Log.d("Upper", upperResult.toString()) // CHAQUOPYРезультат в logcat:
D/Sum: 10 D/Count: 4 D/Upper: CHAQUOPY
4. Многоэкранное Kivy-приложение с анимацией
Пример показывает использование ScreenManager и анимации. Структура main.py:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.animation import Animation
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
class MainScreen(Screen):
def __init__(self, **kwargs):
super().__init__(**kwargs)
layout = BoxLayout(orientation='vertical')
label = Label(text='Главный экран', font_size='24sp')
btn = Button(text='Перейти', size_hint=(1, 0.3))
btn.bind(on_press=self.go_second)
layout.add_widget(label)
layout.add_widget(btn)
self.add_widget(layout)
def go_second(self, instance):
anim = Animation(opacity=0, duration=0.3) + Animation(opacity=1, duration=0.3)
anim.start(self.manager)
self.manager.current = 'second'
class SecondScreen(Screen):
def __init__(self, **kwargs):
super().__init__(**kwargs)
layout = BoxLayout(orientation='vertical')
label = Label(text='Второй экран', font_size='24sp')
btn = Button(text='Назад', size_hint=(1, 0.3))
btn.bind(on_press=self.go_back)
layout.add_widget(label)
layout.add_widget(btn)
self.add_widget(layout)
def go_back(self, instance):
self.manager.current = 'main'
class MyApp(App):
def build(self):
sm = ScreenManager()
sm.add_widget(MainScreen(name='main'))
sm.add_widget(SecondScreen(name='second'))
return sm
MyApp().run()При запуске на Android вы увидите два экрана с плавными переходами при нажатии кнопок. Результат - анимированное приложение с навигацией.