Decompilar una aplicación de Android

Las aplicaciones en Android se programan en Java y es un hecho conocido que Java se puede decompilar con relativa sencillez. Existen varios programas con interfaz gráfica, distintos nombres, distintas utilidades pero al final todos usan uno internamente AFAIK para funcionar: jad.

Debido a esto es fácil caer en el error como a mi me ocurrió de pensar en que los programas de Android se van a poder decompilar y modificar fácilmente. Esto en la realidad no ocurre así ya que el código binario generado para Android es para su ejecución en la DalvikVM que no tiene nada que ver con el bytecode de Java.

Cuando descomprimes un apk (porque también es bien sabido que no es más que un zip renombrado con unas características especiales), se puede encontrar un fichero classes.dex que contiene las clases de java usadas por la aplicación, entre otras cosas:

$ file classes.dex
classes.dex: Dalvik dex file version 035

Este fichero se puede deconstruir por ejemplo con las utilidades del proyecto smali, lo cual generará una serie de ficheros .smali con los opcodes de Dalvik. Estos ficheros .smali tienen el siguiente aspecto:

.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 2

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

const-string v1, «Hello World!»

invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

return-void
.end method

Así el fichero se puede en principio modificar con mayor o menor dificultad y volver a compilar con smali.

Pero no todo es tan bonito como parece hasta aquí, porque ahora hay que reconstruir el apk de la aplicación. El primer paso será actualizar el classes.dex dentro del apk. Esto se puede hacer con la misma utilidad zip estándar. Después hay que firmar el archivo con algo como:

$ jarsigner -verbose -keystore my_keystore com.nauj27.android.hackme.apk android

El problema viene cuando se intenta verificar la firma del paquete, obteniendo el siguiente mensaje:

$ jarsigner -verify com.nauj27.android.hackme.apk
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex

Cada fichero lleva una firma SHA1 que AFAIK no es posible saltarse. Probablemente se podrá hacer algo más pero por ahora lo voy a dejar aquí.

Etiquetas: , , , :: Archivado en Android

El niño Laí

El niño Laí es un relato corto que escribió JJ Merelo hace algunos años y que ganó un premio y todo. Yo lo he descubierto ahora porque PJorge se ha currado una versión en ePub que se ve de maravilla en cualquier cacharrín que sea capaz de leer estos formatos. Se ve igual de bien en Papyre donde lo he leído que en el programa Aldiko para Android.

La historia comienza cuando unos amigos deciden cuál va a ser su proyecto fin de carrera, enlazando una trama donde El niño Laí, un robot que se parece a R2D2 termina siendo torero. Una trama que te atrapa desde el principio y que me leído en una tarde. Y mira que a mi los libros suelen durarme porque los leo muy poquito a poco.

Si quieres echarle un vistazo lo puedes bajar libre y gratuítamente de la web oficial http://niniolai.mobi/

Etiquetas: , , , , :: Archivado en GNU/Linux

Android 2.1 oficial para HTC Hero

Hoy ha salido en Taiwán la versión 2.1 para HTC Hero oficial por parte de HTC. En el momento de escribir esto están saliendo literalmente decenas de versiones rooteadas en el foro de XDA-developers. Más información en mi noticia en bleiraner.com.

Etiquetas: , , , :: Archivado en Android

Vuelta por Santa Fe

Aprovechando el festivo hemos estado dando una vuelta por Santa Fe.

Puente a aguas termales de Santa Fe

Es un recorrido bastante sencillo aunque uno de los más largos que solemos hacer. Tiene un punto malo y es que es casi todo carretera. A día de hoy podríamos cambiar incluso el «casi todo» por un «todo», ya que han ido asfaltando los caminos que solíamos transitar como caminos de tierra.

Sierra Nevada

Después del salto está el mapa. Está puesto así porque tarda casi un minuto para cargar.

Leer el resto de la entrada »

Etiquetas: :: Archivado en MTB

Color Picker 1.1

Acabo de subir al Android Market la versión 1.1 de Color Picker. Esta versión elimina los mensajes de debug internos, lo cual debería dar un poco más de fluidez, además de incorporar varios idiomas: inglés, alemán y español.

Etiquetas: , , :: Archivado en Android

Cumbres Verdes

La otra tarde estuvimos en Cumbres Verdes con la bici subiendo desde Gójar, es una de las rutas que tenemos catalogadas como difíciles. Las pendientes son bastante fuertes y en algunos tramos no se puede decir que haya camino, pero estos son precisamente los pequeños alicientes que mejoran la ruta.

Sunset

A la vuelta ya estaba empezando a anochecer por lo que la elección de la ruta fue clave para poder disponer de estas maravillosas vistas.

El mapa y los datos de la ruta después del salto, ya que tarda casi un minuto en cargarlo.

Leer el resto de la entrada »

Etiquetas: , :: Archivado en MTB

Color Picker

Estando de cervezas con varios androides de Bleiraner, se habló sobre hacer una aplicación que detectase el color de algo en una foto. Con motivo de aprender a programar e ir haciendo cosillas he hecho por fin la aplicación de la que hablábamos.

Captura de pantalla de la aplicación

Captura de pantalla de la aplicación

Sí, los nombres que da a mi también me parecen graciosos, y algunos incluso ridículos, pero es así como se llaman en el sistema de color RAL.

Bueno pues aquí tenéis el código bidi del market para que la probéis.

Código bidi para el market

Código bidi para el Market

Os agradezco mil si además la votáis desde vuestro teléfono en el market a vuestro criterio y dejáis algún comentario también en el market. Si el comentario es positivo mejor, jeje.

Nota: Esta entrada se publica casi de forma simultánea en bleiraner.com

Etiquetas: , , , , :: Archivado en Android

Hacer una foto en el SDK de Android

Android logo Últimamente he estado enredando un poco con el SDK de Android y me he encontrado con esos pequeños detalles  que hay que tratar con cuidado.

La vista previa de la cámara de fotos en Android es una sencilla tarea que requiere unos sencillos pasos en principio, pero que se puede complicar debido a pequeños detalles que hay que tener en cuenta.

Las aplicaciones en android están compuestas de pantallas llamadas Activity. Se puede pensar en los activity como el equivalente al form en una aplicación de escritorio. Un activity es una pantalla con una serie de controles que realiza una actividad concreta.

Lo bueno de esta estructura es que cualquier aplicación puede publicar sus activity de modo que otra pueda hacer uso de ella. Por ejemplo, desde una aplicación que muestre una lista de contactos del móvil se puede abrir el activity del teléfono para realizar una llamada.

De este modo si estás desarrollando una aplicación que requiere realizar una foto, parece interesante usar la propia aplicación de fotografías que traiga el sistema. Hasta aquí todo bien hasta que te pones manos a la obra.

Resulta que cuando le pides al activity de la aplicación de cámara que haga una foto, la resolución de la foto que devuelve no puedes especificarla, sino que te tienes que apañar con lo que haga. Hay que tener en cuenta que mi HTC Hero actualmente tiene android 1.5 y que estos temas están mejor tratados en versiones posteriores de android, pero las aplicaciones que hago han de funcionar al menos en mi teléfono.

Según la documentación si se añade un atributo EXTRA_OUTPUT se devuelve la imagen a resolución completa, y si no, se devuelve una imagen pequeñita. La realidad es distinta, ya que con el atributo de EXTRA_OUTPUT se recibe una imagen de 512x384px, al menos en algunos modelos de teléfono.

El tamaño concreto de la imagen devuelta donde se supone que ha de ser de resolución completa es de un cuarto de la resolución total del sensor. Además, la manera de devolver los datos es distinta según el teléfono, marca, modelo e implementación. Como puede leerse en un comentario de octubre de 2009, Google ha definido cómo debe de ser la petición de captura de imagen, pero no así la implementación de la respuesta en la aplicación de cámara. HTC en su interfaz Sense ha creado su propia manera de hacer fotos, donde los datos devueltos  y la manera de tratar la información capturada es distinta a la original.

Si se quiere por tanto tener control sobre la cámara y la foto realizada no hay más remedio que programar un activity propio que haga la vista previa y la captura de la imagen. Este es el único modo de configurar todos los parámetros a medida.

En el siguiente artículo explicaré los problemas que encontré con la creación del activity de foto propio y cómo resolverlos.

Etiquetas: , , :: Archivado en Android