Crear una aplicación Android con Python es posible mediante frameworks como Kivy y herramientas de empaquetado como Buildozer y python-for-android. El resultado puede ser un archivo APK instalable para pruebas. El proceso es más complejo que convertir un script en EXE porque Android exige una estructura de aplicación, permisos, SDK, NDK, firma y recursos específicos.
Antes de comenzar, revisa la guía de entornos virtuales, el tutorial para instalar paquetes con pip, el artículo de pathlib, la guía de manejo de excepciones y la versión inglesa de generación de APK con Python.
Las fuentes externas principales son la documentación oficial de Kivy para Android y la documentación oficial de Buildozer.
Entender las herramientas
Kivy crea la interfaz y administra eventos. python-for-android reúne Python, bibliotecas y componentes Android. Buildozer simplifica la configuración mediante un archivo buildozer.spec y ejecuta el proceso de compilación.
Buildozer se utiliza normalmente en Linux. En Windows puedes trabajar mediante WSL2 o una máquina virtual Linux. La compilación directa desde Windows no sigue el flujo estándar recomendado.
Crear un entorno de desarrollo
mkdir mi_app_android
cd mi_app_android
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install kivy buildozer
Las dependencias del sistema varían según la distribución y la versión de las herramientas. Sigue la documentación oficial y no copies comandos antiguos sin revisar.
Crear una aplicación Kivy mínima
Guarda este contenido como main.py:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
class Interfaz(BoxLayout):
def __init__(self, **kwargs):
super().__init__(orientation="vertical", padding=20, spacing=10, **kwargs)
self.etiqueta = Label(text="Hola desde Python")
self.boton = Button(text="Presionar")
self.boton.bind(on_press=self.cambiar_texto)
self.add_widget(self.etiqueta)
self.add_widget(self.boton)
def cambiar_texto(self, instancia):
self.etiqueta.text = "La aplicación funciona"
class MiAplicacion(App):
def build(self):
return Interfaz()
if __name__ == "__main__":
MiAplicacion().run()
Ejecuta en el escritorio antes de compilar:
python main.py
Inicializar Buildozer
buildozer init
El comando crea buildozer.spec. Este archivo define nombre, paquete, versión, orientación, requisitos, permisos y recursos.
Configurar nombre y dominio
title = Mi Aplicacion
package.name = miapp
package.domain = com.ejemplo
El identificador final será similar a com.ejemplo.miapp. Utiliza letras minúsculas y un dominio que controles para proyectos publicados.
Definir la versión
version = 1.0.0
Cada actualización publicada necesita una versión coherente y un código de versión creciente según el proceso de distribución.
Configurar requisitos
requirements = python3,kivy
Añade únicamente las bibliotecas utilizadas. No todos los paquetes de PyPI funcionan automáticamente en Android, especialmente los que contienen extensiones nativas sin receta compatible.
Seleccionar extensiones de archivos
source.include_exts = py,png,jpg,kv,json
Incluye los recursos utilizados y evita copiar archivos de desarrollo, secretos o bases de datos privadas.
Definir orientación
orientation = portrait
También puedes permitir varias orientaciones, pero la interfaz debe adaptarse a diferentes tamaños y densidades.
Crear un icono
icon.filename = %(source.dir)s/assets/icon.png
Utiliza una imagen cuadrada de buena calidad y comprueba cómo se adapta al recorte de los launchers. Android moderno puede utilizar iconos adaptativos mediante configuraciones adicionales.
Añadir una pantalla de inicio
presplash.filename = %(source.dir)s/assets/presplash.png
Mantén la imagen ligera para no aumentar el tiempo de inicio.
Compilar un APK de depuración
buildozer -v android debug
La primera compilación puede descargar SDK, NDK y otras herramientas, por lo que tarda más y necesita espacio en disco. El APK suele aparecer en la carpeta bin.
Instalar y ejecutar en un dispositivo
Activa las opciones de desarrollador y la depuración USB únicamente en un dispositivo de pruebas. Conecta el móvil y ejecuta:
buildozer android deploy run
Para ver logs:
buildozer android logcat
Desactiva la depuración USB cuando no sea necesaria.
Probar con adb
adb devices
adb install -r bin/miapp-debug.apk
Acepta la autorización en el dispositivo y verifica que el equipo sea confiable.
Permisos de Android
Declara solo los permisos necesarios:
android.permissions = INTERNET
No solicites almacenamiento, ubicación, cámara o micrófono si la función no los necesita. Además de declararlos, algunos permisos requieren solicitud durante la ejecución.
Acceder a Internet
Una solicitud HTTP debe realizarse sin bloquear la interfaz. Utiliza herramientas asíncronas o ejecuta la tarea fuera del hilo principal y muestra estados de carga. Define timeout y maneja errores de conexión.
Almacenamiento de archivos
Android restringe rutas y acceso al almacenamiento. Guarda datos internos en el directorio proporcionado por la aplicación:
from pathlib import Path
from kivy.app import App
ruta = Path(App.get_running_app().user_data_dir)
ruta.mkdir(parents=True, exist_ok=True)
archivo = ruta / "config.json"
No escribas en el directorio temporal del paquete.
Separar la interfaz con lenguaje KV
Crea miaplicacion.kv:
<Interfaz>:
orientation: "vertical"
padding: "20dp"
spacing: "10dp"
Label:
id: etiqueta
text: "Hola desde Kivy"
Button:
text: "Cambiar"
on_release: etiqueta.text = "Botón presionado"
Incluye la extensión kv en source.include_exts.
Usar unidades dp y sp
Las pantallas Android tienen densidades distintas. Utiliza dp para dimensiones y sp para texto en lugar de píxeles rígidos.
Evitar bloquear la interfaz
El bucle de eventos debe permanecer libre. Una operación larga congela la pantalla. Utiliza Clock.schedule_once, threads para I/O o procesos compatibles, y vuelve al hilo principal para modificar widgets.
Depurar errores de compilación
Lee el primer error relevante, no solo la última línea. Los fallos comunes incluyen dependencias del sistema ausentes, versión incompatible de Java, falta de espacio, recetas no disponibles y nombres de paquetes inválidos.
buildozer android clean
buildozer -v android debug
Limpiar obliga a recompilar y puede tardar. Hazlo cuando cambien componentes importantes o el caché esté dañado.
Reducir el tamaño
El APK incluye Python y bibliotecas, por lo que será mayor que una aplicación nativa mínima. Elimina dependencias no usadas, recursos duplicados y archivos de desarrollo. No comprimas agresivamente sin probar el inicio.
Arquitecturas
Configura las arquitecturas compatibles según el público y los requisitos de la tienda:
android.archs = arm64-v8a, armeabi-v7a
Las opciones compatibles pueden cambiar. Consulta la documentación actual de python-for-android y de la plataforma de distribución.
Firmar una versión de lanzamiento
Una compilación para distribución debe firmarse con una clave privada. Protege el keystore, su contraseña y las copias de seguridad. Perder la clave puede impedir actualizar la aplicación existente.
No guardes el keystore ni contraseñas en Git. Utiliza secretos de CI o almacenamiento seguro.
APK frente a AAB
El APK es útil para pruebas e instalación directa. Las tiendas pueden exigir Android App Bundle para publicación. Revisa las reglas actuales de la plataforma antes de preparar una versión final.
Probar en varios dispositivos
Verifica distintas resoluciones, versiones de Android, orientaciones, permisos, modo sin conexión y reanudación después de minimizar. Un emulador ayuda, pero no sustituye un dispositivo real.
No incluir secretos
Cualquier token incluido en el APK puede extraerse. Las credenciales sensibles deben permanecer en un servidor seguro. La aplicación puede autenticarse y recibir permisos limitados.
Automatizar compilaciones
Puedes utilizar CI con una imagen Linux preparada, pero fija versiones, protege claves y conserva artefactos con hashes. Una compilación reproducible facilita investigar errores y publicar actualizaciones.
Errores frecuentes
Los problemas más habituales son intentar compilar directamente desde Windows sin entorno Linux, añadir paquetes incompatibles, solicitar permisos innecesarios, bloquear la interfaz, escribir en rutas prohibidas y perder la clave de firma. También es frecuente pensar que cualquier script de terminal se convierte automáticamente en una aplicación móvil.
Conclusión
Crear un APK con Python requiere construir una interfaz Kivy, configurar Buildozer y compilar en un entorno Linux compatible. Empieza con una aplicación mínima, añade dependencias gradualmente y prueba en un dispositivo. Cuida permisos, almacenamiento, rendimiento y firma. Con un archivo SPEC bien configurado y pruebas repetibles puedes transformar un proyecto Python en una aplicación Android funcional.






