Python для мобильной платформы Android: от идеи до работающего приложения

Раздел: Мобильная разработка -> 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.spec android.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 вы увидите два экрана с плавными переходами при нажатии кнопок. Результат - анимированное приложение с навигацией.

Код Python на Android - comments

En
код python на андроид (python)