viernes, 4 de febrero de 2011

Depurar proyectos en Android (Source not found)

Sacado de aqui y de diversas fuentes que voy poniendo enlaces conforme vayan saliendo. Yo no he inventado ésto, ni lo he descubierto, solo os lo pongo aquí para que no perdais el tiempo como lo he tenido que perder yo.


Si hay alguna parte que os parece que hay algún agujero en la explicación, os atrancais en algun punto o no os funciona, decidmelo en los comentarios e intentaré solucionarlo en la medida de mis posibilidades. Estaré atento a los comentarios, lo prometo ;)


Llego a un punto del proyecto en el que necesitaba debuggear ciertos errores, me salía un mensaje en el eclipse que decía Source Not Found, me costó algo de tiempo solucionar ésto. Si os ha servido de ayuda, por favor, linkadme, poned un comentario, o enviadme cheques a mi casa.



El mismo problema aparece cuando estás debuggeando. Hay que conseguir los fuentes de android para colocarlos en la carpeta donde tengas instalado el sdk de android. Como siempre hay varias maneras de conseguir ésto. Una sencilla y otra un poco más complicada.


La manera sencilla: aprovecharse del trabajo de otros


La manera sencilla es descargar directamente los fuentes preparados que un amable caballero nos ha preparado para que los usemos (nos 22MB cada uno). Aquí os dejo los enlaces:




La manera de los valientes: prepararse su propio zip


Comencemos el camino de los valientes. Necesitamos varias cosicas:

  • Python 2.4 lo más normal es que lo tengas instalado, si no es así lo puedes obtener de su página oficial.
  • JDK 6. Si no tienes éste, apaga y vámonos.
  • Git 1.5.4 or más moderno. Puedes encontrarlo en http://git.or.cz/ o en tu gestor de paquetes (sudo apt-get install git-core).


Ahora hay que instalar Repo. Repo es una herramienta que hace más facil todo el proceso de bajar los fuentes de android. Para más información acerca de Repo visiten la exquisita documentación de google acerca del tema.

  1. Creamos un directorio en nuestra carpeta personal y lo incluimos en el path:
    mkdir ~/bin
    PATH=~/bin:$PATH
    
  2. Descargamos el comando repo y nos aseguramos que está como ejecutable
    curl http://android.git.kernel.org/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    


Una vez tengamos todos los requisitos creamos una carpeta para meter todos los fuentes de android.


cd
mkdir android-src
cd android-src

Ahora llamamos al repo que hemos bajado para inicializar el repositorio

  • CupCake (Android 1.5)
  • Donut (Android 1.6)
  • EClair (Android 2.0)
  • Froyo (Android 2.2)
  • Gingerbread (Android 2.3)
repo init -u git://android.git.kernel.org/platform/manifest.git -b donut



Debe dar una salida como lo siguiente:

Getting repo ...
from git://android.git.kernel.org/platform/manifest.git
remote: Counting objects: 659, done.
remote: Compressing objects: 1remote: 00% (285/285), done.
remote: Total 659 (delta 256), reused 617 (delta 237)
Receiving objects: 100% (659/659), 180.40 KiB | 100 KiB/s, done.
Resolving deltas: 100% (256/256), done.
From git://android.git.kernel.org/platform/manifest
 * [new branch]      android-1.5 -> origin/android-1.5
 * [new branch]      android-1.5r2 -> origin/android-1.5r2
 * [new branch]      android-1.5r3 -> origin/android-1.5r3
 * [new branch]      android-1.5r4 -> origin/android-1.5r4
.......................
 * [new tag]         android-sdk-tools_r7 -> android-sdk-tools_r7
From git://android.git.kernel.org/platform/manifest
 * [new tag]         android-1.0 -> android-1.0

Your Name  [angel]: 

Nos pide el nombre amablemente, se lo damos. Nos pide una dirección de correo electrónico, yo se la dí, los conspiranoicos que pongan lo que quieran. Cuando terminemos tiene que salir una cosa como ésta.

repo initialized in /home/angel/android-src


Ya tenemos incializado el repositorio, ahora le damos a bajar los fuentes con el comando

repo sync

Se pone a bajar una gran cantidad de archivos, unos 4 gigas me bajó a mi.

Initializing project platform/bionic ...
remote: Counting objects: 7582, done.
remote: Compressing objects: 100% (2710/2710), done.
remote: Total 7582 (delta 5191), reused 7124 (delta 4805)
Receiving objects: 100% (7582/7582), 2.62 MiB | 176 KiB/s, done.
Resolving deltas: 100% (5191/5191), done.
From git://android.git.kernel.org/platform/bionic
 * [new branch]      cdma-import -> korg/cdma-import
 * [new branch]      cupcake    -> korg/cupcake
 * [new branch]      cupcake-release -> korg/cupcake-release
........................
 * [new tag]         android-sdk-tools_r7 -> android-sdk-tools_r7

Checking out files: 100% (7697/7697), done.ut files:   4% (331/7697)   
Checking out files: 100% (5528/5528), done.
Checking out files: 100% (453/453), done.g out files:   5% (27/453)   
Checking out files: 100% (3804/3804), done.out files:   3% (116/3804)   
Checking out files: 100% (4187/4187), done.out files:  25% (1061/4187)   
Checking out files: 100% (403/403), done.g out files:  21% (85/403)   
Checking out files: 100% (641/641), done.g out files:  23% (148/641)   
Checking out files: 100% (601/601), done.g out files:   3% (23/601)   
Checking out files: 100% (7313/7313), done.out files:  18% (1332/7313)   
Checking out files: 100% (6591/6591), done.out files:   0% (62/6591)   
Checking out files: 100% (350/350), done.ng out files:  48% (169/350)   
Checking out files: 100% (282/282), done.ng out files:  10% (31/282)   
Checking out files: 100% (1670/1670), done. out files:   0% (8/1670)   
Checking out files: 100% (11/11), done.king out files:  45% (5/11)   
Syncing work tree: 100% (141/141), done.  

Y así termina el proceso y terminamos con un directorio lleno de cosicas como éste.




Ahora hay que preparar los bonitos zips. Un caballero nos propone hacerlo con un script de python. Otro caballero explica como hacerlo a mano. Me cuadra la primera forma.


Creamos un archivo en la carpeta sources llamado prepara.py, lo editamos y pegamos ésto:

from __future__ import with_statement  # for Python < 2.6

import os
import re
import zipfile

# open a zip file
DST_FILE = 'sources.zip'
if os.path.exists(DST_FILE):
  print DST_FILE, "already exists"
  exit(1)
zip = zipfile.ZipFile(DST_FILE, 'w', zipfile.ZIP_DEFLATED)

# some files are duplicated, copy them only once
written = {}

# iterate over all Java files
for dir, subdirs, files in os.walk('.'):
  for file in files:
    if file.endswith('.java'):
      # search package name
      path = os.path.join(dir, file)
      with open(path) as f:
        for line in f:
          match = re.match(r'\s*package\s+([a-zA-Z0-9\._]+);', line)
          if match:
            # copy source into the zip file using the package as path
            zippath = match.group(1).replace('.', '/') + '/' + file
            if zippath not in written:
              written[zippath] = 1
              zip.write(path, zippath)
            break;
         
zip.close()
Ahora nos vamos a la carpeta y ejecutamos:
python prepara.py 

Ya tenemos los fuentes, ahora que?

Una vez tenemos los fuentes, creamos un directorio llamado sources dentro de la carpeta donde esta el android.jar que estamos usando, en mi caso es la carpeta android-sdk-linux_86/platforms/android-4/sources y la carpeta tiene que tener una pinta como ésta:

Con esto ya tenemos los fuentes de android integrados en eclipse para poder curiosear y mirarle las tripas a este amiguito que nos regala google. Sin embargo para que el debugger encuentre esos fuentes hay que indicárselo

Hay que cambiar la perspectiva de eclipse a modo debug

Botón derecho en el proyecto y darle a "Edit Source Lookup"

Le damos "Add" y luego "File System Directory"

Le damos "Browse" y localizamos nuestra carpeta de sources creada, en mi caso:

Y Voilá... ya tenemos nuestro debugger funcionando para que sepamos de qué va el error que nos estaba dando el programa

9 comentarios:

EphramDoyle dijo...

He probado la manera sencilla y funciona perfectamente. Saludos!

Angel dijo...

Me alegro que haya ayudado, ese es el espíritu.

Gracias por el comentario.

Shinta dijo...

Y en windows como instalo repo?

Angel dijo...

Prueba la manera sencilla, con los zips preparados que hay. No uso windows, no te puedo ayudar con eso, lo siento.

Shinta dijo...

Los zips ya los habia visto pero necesito los de froyo (2.2), de todas maneras estaba trabajando en windows porque no me ha dado ganas de reinstalar el debian en mi desktop, pero creo que ahora tengo una buena razon para hacerlo.
Una ultima cosa, muchas gracias por todo lo que te has esforzado escribiendo estos tutoriales, sigue asi. Por cierto antes de encontrar tu blog de andengine, "compre" un ebook que se publicara en diciembre de este ano que a pesar de ser "profesional" no lo siento tan bien explicado como tu blog, asi que le llevas la delantera a algunos.

Ps: el libreo se llama "Learning android game programming" lo compre en safari books

Shinta dijo...

Espero que a alguien le sirva esto: http://www.megaupload.com/?d=293G0ELB es el zip con el source code de froyo, creado siguiendo esta util guia.

Angel dijo...

Gracias, con tu permiso lo incluyo en el articulo, ok?

Shinta dijo...

Porsupuesto, es por eso que lo publique en tu blog, para dar una ayuda.

Unknown dijo...

Excelente aporte, felicitaciones por la investigación y tiempo invertido. Gracais por compartirlo.

Publicar un comentario