desarrollo de apps en Python

Desarrollo de apps en Python para Android

En este nuevo post vamos a enseñar sobre desarrollo de apps en Python para Android, en Ubuntu. Con esto aprovechamos la transversalidad de Python con las plataformas Windows, Linux, iOS y Android.

Me siento contento de poder compartir estos procedimientos para que puedas convertir tus apps desarrolladas en Python, en APKs de Android. Gracias al framework Kivy y a Buildozer, podemos desarrollar aplicaciones multiplataforma, con eso le hacemos un poco de quite a la abrumadora fragmentación de los lenguajes de programación.

Con Python desarrollamos la lógica. Con Kivy desarrollamos los elementos visuales y con Buildozer compilamos el programa Python para que nos entregue el APK para Android.

Desarrollo de apps en Python para Android – Instalación de requisitos


Para Ubuntu 20.04 y posteriores

Instalamos el framework Kivy, Buildozer y demás dependencias necesarias:

_$ sudo apt install git zip unzip openjdk-8-jdk autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev _$ sudo apt install build-essential python3-dev python3-setuptools python3-pip python3-smbus #para Ubuntu 22
_$ sudo apt install ccache libncurses5 libstdc++6
_$ sudo apt install lld 
_$ pip install kivy
_$ pip install cython
_$ pip install pyjnius
_$ pip install python-for-android
_$ pip install sockets
_$ pip install buildozer # ó python3.8 -m pip install buildozer

Para Ubuntu 18.04

Tengamos la distribución lo más actualizada posible con:

_$ sudo apt update
_$ sudo apt upgrade

Si te salen fallas entonces arreglalo con:

_$ sudo apt upgrade --fix-missing

Instalamos:

_$ sudo apt install git zip unzip openjdk-8-jdk autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev
_$ sudo apt install build-essential python3-dev python3-setuptools python-pip python3-pip python3-smbus
_$ sudo apt install ccache libncurses5 libstdc++6
_$ sudo apt install lld

Adicionalmente en Ubuntu 18.04:

_$ pip3 install cython
_$ pip3 install pyjnius
_$ pip3 install python-for-android
_$ pip3 install sockets
_$ pip3 install kivy # ó sudo pip3 install buildozer
_$ pip3 install buildozer
_$ sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev

Si al tratar de instalar Cython te sale el siguiente error:

ubuntu ERROR: Cannot uninstall ‘Cython’. It is a distutils…

Es porque ya tienes una versión anterior a la 0.29 (al momento de escribir este artículo). Solucinalo desinstalando Cython así:

_$ sudo apt remove cython3

Podemos ejecutar un desarrollo de Python de dos formas: una es ejecutando python3.8 script.py. La otra es colocando en la primera línea del desarrollo el shebang #!/usr/bin/env python3.8, esto para Ubuntu 20.04, luego se le da permisos de ejecución y se pone a correr así: ./script.py. Para Ubuntu 18.04 debemos poner en el shebang la versión 3.6 de Python (así tengamos la versión 3.8), entonces queda #!/usr/bin/env python3.6.

También debemos definir la ruta de nuestro perfil ~./local/bin en nuestra variable de entorno PATH, para que podamos ejecutar buildozer en nuestra consola:

echo ‘PATH=~/.local/bin:$PATH’ >> ~/.bashrc && source ~/.bashrc

Compilando el desarrollo de apps en Python para Android


Debemos tener una carpeta donde vamos a meter nuestro desarrollo, y ahí mismo vamos a compilarlo con Buildozer. Podemos crear una carpeta llamada Prueba/ y ahí meterémos nuestro script de Python. Vamos a comenzar con un sencillo «Hello World»:

#!/usr/bin/env python3.6
import kivy.app
import kivy.uix.label
class TestApp(kivy.app.App):
    def build(self):
        return kivy.uix.label.Label(text="Hello World")
app = TestApp()
app.run()

Bien, guardamos el script «Hello World» con el nombre que queramos, por ejemplo kivy_HolaMundo.py, y así tal cual lo podemos ejecutar como ./kivy_HolaMundo.py:

desarrollo de apps en Python

Sin embargo, este mismo script debe llamarse main.py dentro de la carpeta Prueba/, porque con ese nombre es que Buildozer lo ubica para compilarlo.

Una vez dentro de nuestra carpeta Prueba/ ejecutamos el siguiente comando comando:

_$ buildozer init

Con eso hemos creado el archivo de parametrización de la compilación, llamado buildozer.spec. En este archivo parametrizamos a Buildozer para que incluya dentro del APK, archivos multimedia de nuestro proyecto, así como módulos de Python, y hasta permisos para que nuestro programa conexión a Internet, en Android.

Las siguientes líneas de parametrización debe quedar así (para nuestro caso):

title = My Application
package.name = myapp
source.includes_exts = py,png,jpg,kv,atlas
requirements = python3,kivy,sockets
android.ndk = 19b
android.arch = armeabi-v7a
android.permissions = INTERNET

En la segunda línea definimos el nombre de nuestro archivo APK compilado. La quinta línea es la elección del kit de desarrolo nativo NDK.

Ahora sí compilamos con Buildozer:

_$ buildozer android debug deploy run

No es necesario especificar el archivo main.py. Este proceso de compilación es un poco demorado. Dependiendo de tu máquina y de tu conexión a Internet, puede tomar entre 10 a 40 minutos, debido al proceso de compilación automatizado con Gradle y por las descarga del kit de desarrollo nativo NDK (pesa casi 800 MB), también por la descarga de SDL, porque Kivy no usa componentes nativos, debido a que dibuja toda la interfaz usando OpenGL ES 2.0 y SDL2.

Bueno, después de un rato sabemos que la cosa va bien si nos aparece el texto de aceptación de los términos del contrato con Google:

desarrollo de apps en Python

Si todo va bien, tendremos nuestro archivo APK dentro de la carpeta ~/Prueba/bin/

Ya casi lo terminamos. Ponemos nuestro archivo APK en alguna carpeta de nuestro celular, lo ejecutamos (debemos permitir la instalación de fuentes desconocidas) y listo!:

desarrollo de apps en Python

Además de producir nuestro APK, el Buildozer guarda el NDK y los demás archivos descargados y generados de la compilación en la carpeta oculta .buildozer/ dentro de la carpeta Prueba/.

Manejo de algunos errores


Si has tenido problemas durante el proceso de compilación, borra esa carpeta oculta y vuelve a ejecutar el proceso de compilación.

– Puede que al finalizar el proceso de compilación con buildozer, nos salga un error como el siguiente:

-Incompatible because thiscomponent declares a component for use during compile-time, compatible con Java 11…

La causa más probable de ese error es alguna incompatibilidad entre buildozer y la versión de nuestro Java OpenJDK instalado.

– Puede que al finalizar el proceso de compilación con buildozer, nos salga un error como el siguiente:

-Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

Eso también puede ser a causa de una versión incompatible de nuestro Java OpenJDK con buildozer. En ambos casos, lo que podemos hacer es instalar la versión de Java OpenJDK adecuada y predeterminarla en Linux con la herramienta update-alternativas. Puedes ver ese procedimiento, aquí:

_$ sudo apt-get install openjdk-18-jdk

Cambiar la versión predeterminada de Java en Ubuntu

       ***   ACTUALIZACIÓN DE CONTENIDO – MARZO DE 2024 ***    

Hace dos años (en el 2022) cuando escribí por primera vez este artículo, la compilación del APK era relativamente sencilla. Hoy la compilación del APK requiere de dos pasos adicionales, porque el buildozer de hoy, compila y luego instala el APK en nuestro teléfono directamente (tal como lo hace otros frameworks como Android Studio, ó Flutter). Los pasos adicionales son los siguientes:

1- Instalar adb

_$ sudo apt install adb

2- Poner nuestro teléfono celular en modo desarrollador. Eso lo hacemos yendo a Ajustes -> Acerca del teléfono -> Información de software. Una vez aquí en esta ubicación, le damos tap 7 veces en donde dice Número de compilación, y listo. En el artículo en el que hablo acerca de optimizar Flutter, muestro esos pasos:

Optimización de Flutter

Una vez resueltos estos dos pasos adicionales, volvemos a ejecutar buildozer y listo.

_$ buildozer android debug deploy run

Si lo que queremos es que buildozer solamente compile el APK en el directorio bin/ (como en los viejos tiempos), solo debemos correr el siguiente comando:

_$ buildozer android debug --only-compile

Desarrollo de una app calculadora sencilla distribuida en red


Retomando la calculadora sencilla distribuida en red que hicimos a modo didáctico en el post anterior, podemos pasarla por Buildozer para ponerla a funcionar en Android, y observala funcionando en mi celular en el siguiente vídeo:

play-sharp-fill

Eso es todo por el momento. Nos vemos en el siguiente módulo de programación de apps para Android con Python.


Valora este artículo

Desarrollo de apps en Python para Android
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 1 reviews.
Nombres
Email
Titulo
Calificanos
Contenido

Excelente profe

★★★★★
“ Muy interesante profe, gracias por compartir”
- Arturo Díaz
Comparte esto en
Publicado en Python.

"Mucho más que un aplicativo, el verdadero valor del software libre está centrado en el conocimiento mismo, en su expresión cultural de la lógica hacker." - Franco Iacomella

"Linux viene con el espíritu de la ciencia, es decir, el espíritu de acceso libre y sin restricciones a la información." - Lian ChangTai