Introducción a la programación en Python para Android

Nos llega este interesante proyecto de la mano de Kivy, un framework basado en OpenGL escrito en python que nos permite hacer aplicaciones desktop, IOS, Windows y tambien Android.

Hace poco vimos cómo compilar con el SDK de Android desde otro lenguaje que no sea Java, por ejemplo desde Scala.
Ahora con  Kivy, que es a la vez un framework y un toolkit como PythonQT o como el GTK+ toolkit de Gnome, podemos crear botones, animaciones, elementos visuales desde Python.

Mathieu Virbel, leader programmer de Kivy nos publica hace pocos días este script en Python que permite compilar desde python con el toolchain de Android y de esta forma  obtener un APK para Android.

Introducción: Instalación del Framework Kivy

En nuestro caso no es necesario instalar a kivy, el script de python-for-android nos descaraga directemente el framework de Kivy.

Solo instalamos Kivy para tener los ejemplo Demo a Compilar, no es necesario tenerlo instalado se puede saltar al siguiente paso.

En Mac os, es simple uno se puede bajar el archivo Kivy-1.5.0-osx.dmg para snow Leopard y lo instala como de costumbre, esto instalará todas las dependencias de Python OpenGL

http://kivy.googlecode.com/files/Kivy-1.5.0-osx.dmg

[update] En Ubuntu, para instalarlo desde apt-get:

sudo apt-add-repository ppa:kivy-team/kivy
sudo apt-get install python-kivy

Para Compilar kivy desde easy_install:
Si estas en ubuntu o con Debian, se puede compilar el framework Kivy desde easy_install.

Al instalar desde easy_install, para instalarse, se requiere muchas dependencias como cython que pueden ser descargadas desde pip o easy_install.

sudo apt-get install python-setuptools python-pygame python-opengl python-gst0.10 python-enchant gstreamer0.10-plugins-good cython python-dev build-essential mesa-common-dev libgl1-mesa-dev libgles2-mesa-dev
 sudo pip install Cython==0.17.1
 sudo easy_install pyrex
 sudo easy_install kivy

Aqui inicia el paso para Python-For-Android …

Instalación del NDK y del SDK de Android

Descargar los ejemplos demos:
kivydemo-for-android.zip

Descargar y descomprimir el SDK y el NDK de Android en una carpeta opt.

http://developer.android.com/sdk/ndk/index.html

Luego hay que bien configurar los Paths del SDK y del NDK. Con un Export de ANDROIDSDK y ANDROIDNDK.

vi ~/.bashrc
export ANDROIDSDK=”/opt/android-sdk-linux_86″
export ANDROIDNDK=”/opt/android-ndk-r8″
export ANDROIDNDKVER=r8
export ANDROIDAPI=14

Debes estar seguro que tenes el PATH del SDK y del NDK en tu PATH, podes comprobar esto con un simple echo $PATH, sino agregalos a tu archivo .bashrc
cuando ya terminaste con las variables env, para tomar las variables en tu shell, ejecutas:

source ~/.bashrc

Si no tenés instalado en Ubuntu el git core build essentials Tambien hay que hacerlo:

sudo apt-get install build-essential patch git-core ccache

y vas a necesitar también cython, que es a la vez un lenguaje y una extension para usar librerias en C desde Python:

sudo pip install Cython==0.17.1

Instalación del script python-for-android

Con un simple Clone del proyecto desde github:

git clone git://github.com/kivy/python-for-android.git

Ahora creamos una distribución de la toolchain de Android incluyendo al modulo de Kivy.

./distribute.sh -m "kivy"

Y ya tenemos nuestra toolchain lista para compilar un script en Python que va a generar un APK. Buscamos la carpeta dist y buscamos un ejemplo a compilar.

Podemos mirar el codigo del ejemplo del touchtracer que está en los ejemplos demo de Kivy.

$ vi kivydemo-for-android/touchtracer/main.py
import kivy
kivy.require('1.0.6')

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.graphics import Color, Rectangle, Point, GraphicException
from random import random
from math import sqrt


def calculate_points(x1, y1, x2, y2, steps=5):
    dx = x2 - x1
    dy = y2 - y1
    dist = sqrt(dx * dx + dy * dy)
    if dist < steps:
        return None
    o = []
    m = dist / steps
    for i in xrange(1, int(m)):
        mi = i / m
        lastx = x1 + dx * mi
        lasty = y1 + dy * mi
        o.extend([lastx, lasty])
    return o


class Touchtracer(FloatLayout):

    def on_touch_down(self, touch):
        win = self.get_parent_window()
        ud = touch.ud
        ud['group'] = g = str(touch.uid)
        with self.canvas:
            ud['color'] = Color(random(), 1, 1, mode='hsv', group=g)
            ud['lines'] = (
                Rectangle(pos=(touch.x, 0), size=(1, win.height), group=g),
                Rectangle(pos=(0, touch.y), size=(win.width, 1), group=g),
                Point(points=(touch.x, touch.y), source='particle.png',
                      pointsize=5, group=g))

        ud['label'] = Label(size_hint=(None, None))
        self.update_touch_label(ud['label'], touch)
        self.add_widget(ud['label'])
        touch.grab(self)
        return True

    def on_touch_move(self, touch):
        if touch.grab_current is not self:
            return
        ud = touch.ud
        ud['lines'][0].pos = touch.x, 0
        ud['lines'][1].pos = 0, touch.y

        points = ud['lines'][2].points
        oldx, oldy = points[-2], points[-1]
        points = calculate_points(oldx, oldy, touch.x, touch.y)
        if points:
            try:
                lp = ud['lines'][2].add_point
                for idx in xrange(0, len(points), 2):
                    lp(points[idx], points[idx+1])
            except GraphicException:
                pass

        ud['label'].pos = touch.pos
        import time
        t = int(time.time())
        if t not in ud:
            ud[t] = 1
        else:
            ud[t] += 1
        self.update_touch_label(ud['label'], touch)

    def on_touch_up(self, touch):
        if touch.grab_current is not self:
            return
        touch.ungrab(self)
        ud = touch.ud
        self.canvas.remove_group(ud['group'])
        self.remove_widget(ud['label'])

    def update_touch_label(self, label, touch):
        label.text = 'ID: %s\nPos: (%d, %d)\nClass: %s' % (
            touch.id, touch.x, touch.y, touch.__class__.__name__)
        label.texture_update()
        label.pos = touch.pos
        label.size = label.texture_size[0] + 20, label.texture_size[1] + 20


class TouchtracerApp(App):
    title = 'Touchtracer'
    icon = 'icon.png'

    def build(self):
        return Touchtracer()

    def on_pause(self):
        return True

if __name__ in ('__main__', '__android__'):
    TouchtracerApp().run()

Nos posicionamos en la carpeta de dónde se encuentra el build, resultado de nuestra compilación.

cd dist/default

Luego lanzamos la ejecución del build:

./build.py --package org.test.touchtracer --name touchtracer --version 1.0 --dir ~/code/kivydemo-for-android/touchtracer debug

y tenemos un BUILD SUCCESSFUL

Se encuentra el resultado en un apk compilado que esta en la carpeta bin/. Lo instalamos con un simple adb install.
Aqui esta el resultado del TouchTracer en el Market de Android.

[update] el APK se ejecutará normalmente en dispositivos android que soportan GPU, OpenGPL 2.0 ES, y android Froyo minimo. Para ver si su dispositivo puede correr Kivy Python, prueban correr antes el KivyTest

Si queremos empezar con nuestro propio proyecto:

if __name__ in ('__main__', '__android__'):
    YourApp().run()

Y si queremos empezar ahora con un simple tutorial, les dejo este:”como hacer un juego Pong con kivy

La doc del Kivy Framework API

Github del proyecto: https://github.com/kivy/python-for-android para hacer el clone.

papachan

papachan

Consultor IT y desarollador Java de aplicaciones Móviles sobre la plataforma Android, actualmente reside en Bogota Colombia. Con una experiencia en desarrollo internet de +10 años, se ha involucrado como desarollador senior en varias empresas de desarrollos y servicios en Internet. Ahora es desarrollador Android en Tappsi.co
papachan
papachan

About papachan

Consultor IT y desarollador Java de aplicaciones Móviles sobre la plataforma Android, actualmente reside en Bogota Colombia. Con una experiencia en desarrollo internet de +10 años, se ha involucrado como desarollador senior en varias empresas de desarrollos y servicios en Internet. Ahora es desarrollador Android en Tappsi.co
This entry was posted in Android, kivy, Python4Android and tagged , , , . Bookmark the permalink.

28 Respuestas a “Introducción a la programación en Python para Android”

  1. Hpsaturn dice:

    Buen post,

    Hace falta como requerimiento para algunos usuarios #Debian easy_install cython pyrex antes de #kivy o con #pip tambien. Tambien es recomendable usar virtualenv.

    • papachan dice:

      Exacto, lo de cython puede ser instalado desde el dpkg de Canonical como de Debian, sino por easy_install. Lo de Pyrex tal vez ya lo tenia instalado por eso no lo puse. Voy a hacer una actualizacion del post. Gracias !

  2. Ricardo dice:

    Amigos

    Veo que este post está salao!!!!Pero yo estoy MUY por debajo del nivel de conocimientos para ejecutarlo.

    Por mi iría del Phyton directo al Kyvy.APK, jajajajajaja!!!!!!
    Que barbaridad!!!Bueno que se le va a hacer…

    Saludos y felicitaciones!

    Ric

  3. Gabriela dice:

    Hola, excelente post.

    Esty replicando todas las instrucciones, al llegar a esta:
    ./distribute.sh -m “kivy”

    Me arroja este mensaje de error:
    Check enviromnent
    ANDROIDSDK=”/opt/android-sdk-linux″
    ANDROIDSDK path is invalid, it must be a directory. abort.

    Me podrías ayudar con esto.
    Lo que está en mi archivo .bashrc es:

    export PATH=${PATH}:/opt/android-sdk-linux/tools
    export PATH=${PATH}:/opt/android-sdk-linux/tools/platform-tools
    export ANDROIDSDK=”/opt/android-sdk-linux”
    export ANDROIDNDK=”/opt/android-ndk-r8c”
    export ANDROIDNDKVER=r8
    export ANDROIDAPI=14

    • papachan dice:

      Hola. Tenes que descargar el SDK de android y el NDK de Android en unas de tu carpeta. En linux por ejemplo se puede usar la carpeta “opt” del directorio raiz.

      El script de compilacion, si no encuentra el path del SDK te arroja “No ANDROIDSDK environment set, abort”

      Desde que sistema operativo lo estas compilando?

      • Gabriela dice:

        Hola muchas gracias por responder.
        Estoy desde Ubuntu 12.04 LTS.

        Estoy usando el directorio /opt tal como lo indicas en el post de la siguiente forma:

        /opt/android-ndk-r8c
        /opt/android-sdk-linux.

        • papachan dice:

          y ejecutaste el programa ‘android’, para descargar el api que se necesite para compilar el apk?

          • Gabriela dice:

            Yo ejecute el programa “android” e instalé:

            (Tools)
            Android SDK tools
            Android SDK Platform-tools

            (Android 4.2(API 17))
            Documentation for Android SDK
            SDK Platform
            Samples for SDK
            ARM EABI v7a System Image
            Google APIs
            Sources for Android SDK

            y otros más, pero según leí esos son los necesarios.

            Ahora cuando ejecuto el programa android, me arroja este WARNING en consola no se si tenga que ver:

            ** (java:9033): WARNING **: Could not connect: Connection refused

          • papachan dice:

            La api necesaria no es la API 17 sino la Api 14. Por lo del error de connection esto no deberia pasar. Pero no es un error que impide la compilacion del python-4-android. Podrias compartir el log completo de cuando compila?

  4. Gabriela dice:

    Ya se ejecuto!!!

    Había hecho modificaciones en el .bashrc y no habia hecho source .bashrc, falla del DOS, jiji :)

    Voy a seguir con los siguientes pasos y te comento, muchisimas gracias por la ayuda.

    nota: tambien tenía instalado la API 14 y ya el warning no lo arroja.

  5. Gabriela dice:

    Papachan, yo de nuevo, luego de hacer:
    vi kivydemo-for-android/touchtracer/main.py
    y ver mi código ejemplo.

    Ahora comentas: “Nos posicionamos en la carpeta de dónde se encuentra el build, resultado de nuestra compilación.”

    cd dist/default

    mi directorio “default” está vacío, es allí donde debe estar el build.py ???

    • papachan dice:

      Que raro que no hay nada en default/
      Deberia estar todo el “android project template” generado por el script de python-4-android.
      Si no esta. es que no se hizo bien la instalacion.
      podes volver a ejecutar el script shell y mirar cual es el momento que no se copió estos archivos.

  6. Gabriela dice:

    Ok, solo para saber si estoy bien.

  7. Gabriela dice:

    Ok, solo para saber si estoy bien.

    Yo ejecute esto en mi home:
    git clone git://github.com/kivy/python-for-android.git
    Luego esto tambien en mi home:
    ./distribute.sh -m “kivy”

    Luego voy a buscar el archivo build.py en el directorio:
    dist/default

    Si tu me dices que todo esto es así como lo voy haciendo, voy a hacer lo que me dices.

    Ahora, no comprendo bien lo que me pides que realice cuando me dices:
    “podes volver a ejecutar el script shell y mirar cual es el momento que no se copió estos archivos”

    Cabe destacar que soy nueva en el tema de android.

    Gracias papachan.

    • papachan dice:

      Si. exacto, si el proyecto python-4-android se compiló correctamente entonces solo te falta posicionarte desde dist/default y compilar un proyecto demo para poder generar el apk.

  8. Gabriela dice:

    ok, que me recomiendas que realice?

    Al volver a ejecutar:
    ./distribute.sh -m “kivy”

    me arroja este mensaje:
    ——————————
    Check enviromnent
    SDK located at /opt/android-sdk-linux
    NDK located at /opt/android-ndk-r8c
    NDK version is r8
    API level set to 14
    Check mandatory tools
    Distribution will be located at /home/gabriela/python-for-android/dist/default
    The distribution /home/gabriela/python-for-android/dist/default already exist
    Press a key to remove it, or Control + C to abort.
    ————————–

    Gracias.

    • papachan dice:

      si. exacto. puede que el escript esta detectando tu carpeta pero tiene que volver a copiar los archivos en default. entonces eliges la opcion “press any key to continue”
      la otra es borrar a mano la carpeta default y ejecutar de nuevo distribute.sh.

      • Gabriela dice:

        ok, lo que me dice al final es:

        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S: Assembler messages:
        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S:66: Error: missing ‘)’
        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S:66: Error: garbage following instruction — `pld (r2,#0)’
        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S:259: Error: missing ‘)’
        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S:259: Error: garbage following instruction — `pld (sp,#32)’
        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S:271: Error: missing ‘)’
        /home/gabriela/python-for-android/src/jni/../jni/jpeg/jidctfst.S:271: Error: garbage following instruction — `pld (ip,#32)’
        make: *** [/home/gabriela/python-for-android/src/obj/local/armeabi/objs/jpeg/jidctfst.o] Error 1

        Voy a borrar el directorio y volver a ejecutar, como me recomiendas.

  9. Gabriela dice:

    Papachan hice esto:
    1 Opción:
    Elimine el directorio default y volví a ejecutar ./distribute.sh -m “kivy”, y no agregó nada en el nuevo directorio .

    2 Opción:
    Hice un mv del directorio: mv python-for-android/ python-for-android2/
    Luego volví a ejecutar:
    git clone git://github.com/kivy/python-for-android.git

    Se volvió a crear el directorio: python-for-android/

    Luego ejecute: ./distribute.sh -m “kivy”

    Se volvió a crear el directorio dist/default pero no se creo el build.py. :(

    Tengo el log de toda la ejecución, no se a donde enviartelo, ya me suscribí a http://www.androidda.com/ pero no veo como enviarte el log.

  10. Gabriela dice:

    ok, ya la pegue, esta en http://paste.ubuntu.com/1396134/.

    No se si este log que pegue pueda ayudar en algo, ya estuve todo el día buscando por la web a ver si alguien tenia el mismo problema o parecido, pero aun no consigo mucho.

    Ya no se que hacer :( quiero hacer mi programa en android con python.

    • papachan dice:

      pero esta haciendo las cosas bien. no entiendo. no dice en ningun momento failed.
      entonces te esta instalando bien.
      pegame el resultado de tree de tu directorio python-for-android

  11. […] en nuestro ejemplo anterior usando un simple javascript con la ayuda del plugin phonegap o con la ayuda de python, o hasta proyectos esritos en […]

  12. Carlos cuesta dice:

    yo hice todos estos pasos e incluso me corre el kivy desde geany pero cuando ejecuto ./distribute.sh -m “kivy” solo tengo la siguiente respuesta
    No ANDROIDSDK environment set, abort una y otra vez aun no entiendo por que instalar estas cosas es mas dolorodo que un parto y tan dificil pues

  13. nicolas dice:

    buenas. una pregunta, tenes idea de como es el rendimiento de un aplicacion hecha en kivy comparada con la misma hecha en phonegap ? Gracias

  14. Nicolas dice:

    Buen post! tenes idea si se puede acceder a cosas como el gps o notificaciones de android con kivy?

Deja un comentario

  • Facebook AndroidCol