lunes, 28 de enero de 2013

... Y Android es Unix!!!

En realidad siempre lo he sabido: Android es Unix, pero hasta este momento no me había parado a disfutarlo. Hace unos días rooteé mi teléfono y descubrí el "adb shell". ¡Y vaya descubrimiento!. Ahora, con "su - ", desde ese fantastico "adb shell" ya soy root.

He descubierto que hay 2 particiones que especialmente me resultan interesantísimas: /system y /data.

La primera, /system, es una partición que se monta como solo lectura. En esta partición nunca se mete nada nuevo - Es lo que tiene eso de ser de sólo lectura. Pero tiene un espacio libre que podría venir muy bien en teléfonos escasos de espacio (como por ejemplo, mi Samsung Galaxy ACE).

En la segunda partición, /data, se consume el espacio a pasos de gigante. Todas las actualizaciones del sistema van a parar a esta partición, al igual que otro montón de aplicaciones que tienen que instalarse "por que sí" en la memoria interna del teléfono.

Por otra parte, yo pensaba que había descubierto la panacea para poder instalar aplicaciones sin ningún tipo de problema de memoria, tan sólo había que abrir el "adb shell" con el teléfono al ordenador por USB y teniendo activado el modo de depuración USB activadoen el teléfono y poner "pm setInstallLocation 2" y salir, tal y comenté en una entrada anterior en este blog:

$ adb shell
$ pm setInstallLocation 2
$ exit

Pero eso no era la panacea, ni siquiera es suficiente y la memoria se siguió gastando y mi teléfono siguió con sus "avisos" de no tengo memoria. Pero bueno, ahora sé como entrar en el teléfono.

Yo más o menos me defiendo en Linux, así que, por trasferencia de conocimientos, no me ha sido dificil empezar a trastear con adb.

Y es que ahora tengo una shell para mangonear en el teléfono"un poquitito" tanto como app como desde mi ordenador. Este último tiene la ventaja de contar con un teclado en condiciones. No es que el "adb shell" sirva de mucho, pero claro, desde hace unos días soy root, y aprovechando esa circunstancia, dentro del shell adb
$ su - 


Ahora sí que tengo la Shell para mangonear el teléfono a mi gusto. Así que, parafraseando a Belén Esteban, ¡manos a la obra, que es gerundio!

Aviso que soy novato en esto de trastear con el teléfono, simplemente me he dedicado a observar y a jugar para aprender. Si repites mis acciones y te sale mal no me culpes. En esta entrada del blog lo único que estoy haciendo es explicar lo que yo he hecho en mi teléfono y con mis apps. No he roto nada, pero no quiero decir con ello que no esté en camino de hacerlo o que si siges mis pasos tu rompas algo. Cada cual se responsabilice de lo que hace con su teléfono.

El tema es que haciendo cd pa'rriba y cd pa'bajo, acabé en el directorio /data/log y me doy cuenta de que tengo en ficheros de log de java (con Stack traces de Java Exceptions y toa la ostia) 8Mb de la partición /data de mi pobre teléfono hambriento de espacio - ¡Salgo en su rescate!
# cd /data/log
# for a in *; do > $a ; done

Y resulta que el teléfono me siguió funcionando con unos pocos de megas más en la partición /data.

Leí por ahí que simplemente con dejar el fichero .apk en la carpeta /system/app la aplicación ya estaría instalada, y que también habría que quitarlo de /data/app - Lo que viene siendo el mover un fichero de toda la vida, vaya.

Tengo 2 aplicaciones por ahí, com.devuni.flashlight-1.apk (Linterna) y com.android.vending-1.apk (que Dios me pille confesado y que no sea demasiado importante) y que las voy a mover a /system/app. Pero tengo el problema de que /system/app es de sólo lectura - Hay que volver a montar la partición como lectura escritura. - Miro las particiones con el comando "mount" y veo que /dev/stl12 está montado en la carpeta /system:
# mount

rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
/dev/stl14 /cache rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=utf8 0 0
/dev/stl13 /data rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=utf8 0 0
/dev/stl12 /system rfs ro,relatime,vfat,log_off,check=no,gid/uid/rwx,iocharset=utf8 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
.....

Bueno, pues volvamos a montarla como lectura y escritura...
# mount -o rw,remount -t yaffs2 /dev/stl12 /system

Y voy a mover los ficheros a /system/app.

Me he encontrado con 2 sorpresas a la hora de  trabajar con este shell. La primera es que el comando "cp" no esta en mi Android. La segunda es que el comando "mv" simplemente cambia el nombre de un fichero, es decir, que no podemos usarlo para mover ficheros entre distintas particiones. - Al menos tengo los viejos comando cat y rm que harán la tarea.

Pos ale, a mover todas los apks a la carpeta /system/app:
# cd /data/app
# for a in *.apk; do cat $a > /system/app/$a ; done
# rm /data/app/*.apk

Salgo del shell adb a base de "exit", reinicio el teléfono...

¡Y la linterna me funciona!, ¡hasta con el Widget y todo!
¡Y puedo ir al android Market! - 

¡Las bobadas que hace uno por 15 miserables Megas extra!

No hay comentarios:

Publicar un comentario