Underc0de

Programación Scripting => Python => Mensaje iniciado por: Expermicid en Septiembre 16, 2014, 09:16:57 AM

Título: Introducción a la programación en Python para Android
Publicado por: Expermicid en Septiembre 16, 2014, 09:16:57 AM
Nos llega este interesante proyecto de la mano de Kivy (http://kivy.org/#home), 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 (http://www.androidda.com/2012/01/programando-en-scala-para-android-parte-i/).
Ahora con  Kivy (http://kivy.org/#home), 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 (https://github.com/kivy/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 (http://kivy.googlecode.com/files/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:

Código (text) [Seleccionar]
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 (http://www.cython.org/) que pueden ser descargadas desde pip o easy_install.

Código (text) [Seleccionar]
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

Código (text) [Seleccionar]
sudo pip install Cython==0.17.1
Código (text) [Seleccionar]
sudo easy_install pyrex
Código (text) [Seleccionar]
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 (http://kivy.googlecode.com/files/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.

Código (text) [Seleccionar]
vi ~/.bashrc

Código (text) [Seleccionar]
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:

Código (text) [Seleccionar]
source ~/.bashrc

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

Código (text) [Seleccionar]
sudo apt-get install build-essential patch git-core ccache

y vas a necesitar también cython (http://www.cython.org/), que es a la vez un lenguaje y una extension para usar librerias en C desde Python:

Código (text) [Seleccionar]
sudo pip install Cython==0.17.1

Instalación del script python-for-android

Con un simple Clone del proyecto desde github:

Código (text) [Seleccionar]
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.

Código (text) [Seleccionar]
./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.

Código (text) [Seleccionar]
$ vi kivydemo-for-android/touchtracer/main.py

Código (python) [Seleccionar]
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.

Código (text) [Seleccionar]
cd dist/default

Luego lanzamos la ejecución del build:

Código (text) [Seleccionar]
./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 (https://market.android.com/details?id=org.kivy.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 (http://kivy.org/docs/installation/installation-android.html#installation-of-examples)

Si queremos empezar con nuestro propio proyecto:
   
Código (python) [Seleccionar]
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" (http://kivy.org/docs/tutorials/pong.html#doc-getting-started)

La doc del Kivy Framework API (http://kivy.org/docs/api-kivy.html)

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

Fuente: androidda

Saludos
Título: Re:Introducción a la programación en Python para Android
Publicado por: $francisco en Septiembre 21, 2014, 04:17:43 PM
Esta bastante bien, pero por mi parte me trae algunos problemas al utilizarlo, al instalarlo y al intentar compilarlo me lanza un error "hardwareaccelerated" reinstale en múltiples ocasiones kivy y python for android pero me seguía tirando el error, entonces lo borre todo y exporte las siguientes rutas en el PATH.

export PATH=${PATH}:/opt/android-sdk-linux/platform-tools
export PATH=${PATH}:/opt/android-sdk-linux/tools


entonces hice el

./distribute.sh -m "kivy"

con androidndk-r8 instalado.

entonces ya no me tiraba el error, pero sigue teniendo problemas, tras reiniciar el ordenador tira un error "ant" y tengo que solucionarlo haciendo otra vez

./distribute.sh -m "kivy"

y alguna vez que otra tengo que borrar python for android y volver a descargarlo.

Esto por si a alguien le surge el mismo problema, y cada vez que se baya a compilar hay que exportar todas las rutas, tanto de el SDK, NDK y diría que hasta las de tools y platform-tools.

También lanza algunas veces un error que dice que nose encuentra el archivo project.properties, al parecer crea un archivo que se llama default.properties y tiene que ser modificado manualmente a project.properties. este archivo se encuetra en python-for-android/dist/default/

Y aqui algunas páginas oficiales que me ayudaron mucho.

http://python-for-android.readthedocs.org/en/latest/prerequisites/ (http://python-for-android.readthedocs.org/en/latest/prerequisites/)
http://kivy.org/docs/guide/packaging-android.html (http://kivy.org/docs/guide/packaging-android.html)
http://developer.android.com/reference/android/Manifest.permission.html (http://developer.android.com/reference/android/Manifest.permission.html)

y este último quizás el me mas me ayudo, y si seguís esta página para la instalación no olvidéis exportar a path la ruta de el sdk "tools" y "platform-tools", proporciona el sdk y el ndk, lo mas importante es que porporciona las direcciones de las descargas y eso ayuda mucho.

https://github.com/kivy/python-for-android (https://github.com/kivy/python-for-android)