Sunday, October 6, 2013

Deshacer las .apk para obtener el "source code" de una aplicación Android

¡Buenas de nuevo! (Y perdón por todo el tiempo sin posts, tengo un tiempo muy limitado para escribir).

Hoy voy a hablaros de como obtener el código fuente (o como se conoce más comúnmente, el source code) de una .apk. A veces, yo, como desarrollador de aplicaciones, me gusta "espiar" (sí queréis el término que yo uso, es "mirar el trabajo de los otros para aprender y aplicarlo al mío propio", pero que vamos, viene a ser lo mismo) el trabajo de los demás. Pero hay una barrera, que se llama .apk. Que yo sepa, no existe ningún editor de código que pueda leer los .apk y abrirlos como si fuera un source code, para poder leerlos, y por eso, tenemos que usar técnicas un poco más "oscuras" y deshacer esos .apk para convertirlos en source code.

Bien, demasiada explicación aburrida, vayamos manos a la obra.
¿Qué vamos a necesitar?

  • Un programa que se llama apktool (¿original, eh?). La copia que os doy es una preparada por mí :).
  • Otro programa para leer el source code (Yo usaré Eclipse configurado con el ADT de Android (o si queréis ahorraros todo el paso de intalar el JDK, y las ADT y todo, usad el ADT-Bundle de Android)). Vosotros podéis usar Netbeans o lo que queráis.
  • Descargar el .apk que queramos descomprimir.
  • Otro programa para leer .jar y descomprimir las clases. Yo uso el JD-GUI.
Bien, empecemos instalando el apk tool. Ya que es un poco "complicado", os voy a enseñar cómo se hace. 
  1. Nos descargamos el archivo que he preparado (este).
  2. Lo descomprimimos y ponemos la carpeta en C:\Windows.
  3. Y ya está. No era tan complicado, ¿eh? ;).
Vamos a usarlo. Os he dejado dos archivos preparados. Uno que se llama cmd.lnk y otro que se llama Procedure.txt. Procedures es por sí alguna vez tenemos alguna duda de lo que debemos hacer.

Os voy a explicar como funciona. Voy a usar una app propia que hice para un amigo que se llama Drama Button y que podéis descargar, si queréis, aquí (es una tontería realmente, pero es divertida). Empecemos.

  1. Ejecutamos el cmd.lnk como administradores (Click derecho -> Ejecutar como administrador).
  2. Os debería salir una línea de código que ponga C:\Windows\apktool1.5.2>. Si no os sale, escribís "cd C:\Windows\apktool1.5.2" y le dais a enter. 
  3. Una vez aquí, es útil copiar y pegar el archivo que queremos descomprimir dentro de la misma carpeta del apktool. Cuando lo tenemos dentro, escribimos apktool d NombreDelArchivo.apk. Como ya os he dicho, en mi caso estoy usando una app que se llama DramaButton.apk, así que se vería así: 
    CMD en el paso 3
    CMD en el paso 3.
  4. Ejecutamos y obtenemos una carpeta:
  5. CMD y Carpeta nueva en el paso 4
    CMD y Carpeta nueva en el paso 4
  6. Ahora vamos a ejecutar el siguiente comando para obtener las clases de la app. Escribimos jar xvf NombreDelArchivo.apk classes.dex y se nos creará un archivo que se llamará classes.dex 
    CMD y classes.dex en el paso 5
    CMD y classes.dex en el paso 5
  7. Es raro que alguien conozca que es el archivo .dex, así que vamos a pasarlo a .jar para poder pasarlo al JD-GUI y poder leer las clases. Escribimos dex2jar classes.dex y se nos crea un archivo que se llama classes_dex2jar.jar. 
    CMD y classes_dex2jar.jar en el paso 6
    CMD y classes_dex2jar.jar en el paso 6
  8. Abrimos el JD-GUI y arrastramos el archivo classes_dex2jar.jar al programa. Veremos esto: 
    JD-GUI
    JD-GUI
  9. Damos doble click en "MainActivity" y se nos abre. Ahora si queremos llevarlo a Eclipse para unirlo con los res, le damos a "File->Save All Souces" y lo guardamos cómo y donde queramos. Lo descomprimimos y vamos a la carpeta que se nos ha creado en el paso 4 (C:\Windows\apktool1.5.2\NombreDelArchivo) y creamos una carpeta que se llame src. Copiamos y pegamos las carpetas del zip que nos ha creado el JD-GUI. 
  10. Ahora simplemente, abrimos Eclipse, le damos a "File->Import" y se nos abre una ventana. Vamos a la carpeta Android y le damos a "Existing Android Code Into Workspace". Clicamos en next, y como root directory pondremos el de la aplicación extraída, es decir: C:\Windows\apktool1.5.2\NombreDelArchivo. Se nos creará un project nuevo y tendremos ahí los res y el código. 
  11. Nota final: Muchas veces hay errores de compatibilidad o de archivos que faltan o lo que sea. El apktool no es perfecto. Yo recomiendo leer los archivos de java desde el JD-GUI, ya que es lo mismo y es más cómodo. Pero esto ya, a vuestra elección.
En unos 5 minutos si somos lentos y vamos leyendo y haciendo poco a poco, hemos obtenido el source code de cualquier aplicación que queramos ver. 

A mí me ha ayudado muchas veces para ver cómo la gente programa las cosas y espero que os sea útil a vosotros también.

Muchas gracias por leerme un día más.

¡Saludos a todos!
finish(); ;)