Activar Proguard en Eclipse para Android

Una de las recomendaciones antes de publicar tu app Android en la Play Store es activar Proguard. Y ¿Qué es Proguard ? pues no es más que una clase Java que optimiza, verifica, comprime y ofusca el código. Es muy útil porque las app android se distribuyen en un archivo apk que permite con no mucha dificultad hacer ingeniería inversa, cosa que en mi caso al desarrollar software libre no es muy importante pero para muchos desarrolladores si lo puede ser. Además el tamaño del archivo apk termina siendo mucho menor y eso de nuevo vuelve a ser importante ya que  no está permitivo subir una app a la Play Sotre con un tamaño superior a 50MB. En mi caso el tamaño de PeakHour.apk pasó de 2.4 a 1.5 megas, como veis si se nota bastante.

 

Para activar Proguard tal y como queda el proyecto en una instalación de Eclipse para Android (el que viene en el Android Bundle) es muy sencillo, únicamente hay que descomentar una línea en el archivo «project.properties».

 

Proguard

 

Lo que va a suceder a partir de ahora es que cada vez que exportemos la aplicación para firmarla y subirla a producción esta va a ser procesada por Proguard. Las reglas que va a utilizar son las que de los archivos «${sdk.dir}/tools/proguard/proguard-android.txt» y «proguard-project.txt«. El primero viene en la instalación del sdk y trae reglas estándar, el segundo es local a nuestro proyecto y viene sin reglas con la intención de que si necesitamos añadir alguna regla personalizada la pongamos en este archivo. Además existe otro archivo en «${sdk.dir}/tools/proguard/proguard-android-optimize.txt» que es igual al anterior pero con ciertas optimizaciones activadas, así que podemos utilizar uno u otro según convenga.

 

Hay que tener en cuenta una cosa cuando utilicemos Proguard, y es que al ofuscar el código reemplaza el nombre de clases, métodos y atributos dejando un archivo de mapeo de los cambios que ha realizado. Es muy importante guardar este archivo ya que en cada nueva versión se generará un mapeo diferente y lo que es peor, el mapeo anterior quedará sobreescrito por el nuevo. Si no vas guardando el archivo de mapeo de cada versión no serás capaz de descifrar la clase, método o atributo cuando recibas una traza de un usuario al producirse algún error. Lo suyo en estos casos es utilizar el control de versiones o ir renombrándolos antes de que sean sobrescritos, por ejemplo mapping-1.txt, mapping-2.txt

Para poder descifrar una traza tendremos que utilizar esta orden:

 

retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]

 

Por último comentar que estos archivo que genera Proguard se almacenan en el directorio «proguard» de nuestro proyecto y como veremos a parte del archivo de mapeo también nos genera algunos más como el volcado del proceso «dump.txt«, etc.

 

Cheli

Corregir «SIGSEGV» del Eclipse que viene en el Android Bundle

¿Qué podemos hacer cuando se produce este error?:

 

#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007fada5b66718, pid=5708, tid=140384133080832
#
# JRE version: OpenJDK Runtime Environment (7.0_55-b14) (build 1.7.0_55-b14)
# Java VM: OpenJDK 64-Bit Server VM (24.51-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libgobject-2.0.so.0+0x19718] g_object_get_qdata+0x18
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try «ulimit -c unlimited» before starting Java again
#
# An error report file with more information is saved as:
# /home/cheli/adt-bundle-linux-x86_64-20140702/eclipse/hs_err_pid5708.log
Compiled method (nm) 103325 1324 n org.eclipse.swt.internal.gtk.OS::_g_object_get_qdata (native)
total in heap [0x00007fadb0394a90,0x00007fadb0394e10] = 896
relocation [0x00007fadb0394bb0,0x00007fadb0394c10] = 96
main code [0x00007fadb0394c20,0x00007fadb0394e10] = 496
#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
# http://icedtea.classpath.org/bugzilla
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

Un Core Dump es un volcado de la pila para trazar el fallo que se ha producido, en el siguiente vídeo comento que aunque falla al escribir el core dump ya podemos deducir con los datos que nos da que el error realmente está en la librería gtk 2 y es consecuencia de un bug en el oxigen-gtk theme. Para solucionar el problema podemos cambiar el tema y listo.

 

https://www.youtube.com/watch?v=_mzxwqVCuBs

 

Cheli