[Guía Rápida] [Guía Rápida] Bind4Swap - DirectoryBind para hacer swap de la memoria de Android
Uso de este artículo
Se permite utilizar este articulo, ya sea copiandolo entero o partes de el, o referenciándola mediante un link, a cualquiera que lo desee, con la única condición de que se mantenga el autor y un enlace a la fuente original de este artículo, y que se encuentra en mi blog.
Para actualizaciones sobre este artículo, sugiero visitar el enlace mencionado anteriormente
Manos a la obra
Si prefieres evitarte toda la parte del comienzo, que es donde explico un poco de que va todo esto, puedes ir directamente a la sección "Uso de DirectoryBind como reemplazo al SWAP de memoria".
Introducción
Siguiendo con mis articulos sobre manejo de directorios en Android [CIFS&BIND], hoy voy a generar esta entrada en mi articulo por que creo que es interesante el concepto, y por que asi puedo redireccionar desde mis otros artículos a éste, que este "cambio" de la sdcard se puede hacer casi en cualquier dispositivo y no es invasivo como podría ser modificar algún fichero del sistem (vold.fstab) que podría dejar nuestro dispositivo inutilizable si no se sabe bien que se está haciendo.
Para la mayoría de los usuarios Android, tanto los que son novatos como los que ya tienen algo de experiencia, en algún momento se han topado con el problema típico de que no hay espacio para instalar aplicaciones, y que nos sugiere liberar memoria.
No son pocos los que, en un intento ingenuo, compran una microSD y la insertan en el dispositivo, con la esperanza de solucionar el problema del espacio, pero el mensaje sigue apareciendo.
Esta guía intentará dar una alternativa para solucionar este problema.
Antes de empezar
Creo que es bueno explicar brevemente por que sucede este problema.
La mayoría de los dispositivos Android actuales, vienen con una memoria incluída y que, en la mayoría de los casos, será precisamente esta memoria las que nos dará dolores de cabeza.
Para explicarlo de forma rápida, la memoria de un dispositivo android se divide en varias partes (particiones), de las cuales, y para resumir, nos centraremos en las siguientes:
- Partición del sistema operativo (donde se instala Android)
- Partición de aplicaciones (donde instalaremos aplicaciones)
- Partición Flash de almacenamiento (lo que veremos como espacio libre para copiar ficheros)
Ahora, si vemos un dispositivo Android genérico, es típico que venga con una cantidad X de Gb de memoria, pero que en general creemos que es lo que tendremos disponible... pongamos el caso de una tablet X que viene con 8GB de almacenamiento interno. Cuando inspeccionamos el dispositivo, vemos que en realidad tenemos poco mas de 5GB de almacenamiento interno, y muchos usuarios no saben que es lo que pasa con el resto.
A estas alturas ya podemos imaginar lo que ha pasado. Una parte del almacenamiento se destina a las distintas particiones que necesita Android para funcionar, y que a su vez se subdivide en las distintas particiones como las que antes he comentado.
Por tanto, lo que vemos es lo que queda disponible una vez Android ha sacado lo que necesita para poder funcionar.
¿Como se instala una aplicación?
Antes de seguir, decir que no soy experto, pero las nociones que tengo creo que son válidas para dar una explicación a nivel de usuario y que podamos entender el concepto general de como se instala una aplicación en Android.
Cuando se instala una aplicación, ya sea del market, desde la microsd, etc. Esta aplicación se copia en alguna parte del sistema para que podamos acceder a ella.
Esta aplicación (su instalación) se instala generalmente en el área o partición definida para las aplicaciones, aunque también podría ir en otros sitios, como podría ser una aplicación de sisetma (por lo que iría en las aplicaciones de sistema), etc.
Cuando Android ha particionado la memoria y ha definido los tamaños de cada parte, en ese momento ha determinado que tamaño tendrá la partición de las aplicaciones que podemos instalar. Generalmente es una partición con espacio suficiente para instalar muchas aplicaciones (por ejemplo, 1GB como en la imagen anterior).
Las aplicaciones en general pesan poco, aunque hay excepciones. Una aplicación (apk) puede desde unos kb, a varios MB, aunque todo depende de como lo haya programado el desarrollador original, puesto que también pueden existir aplicaciones que ocupen 50, o incluso mas.
En la imagen anterior podemos ver los tamaños de algunas aplicaciones, y nos encontramos que juegos como Modernc Combat 4, por ejemplo, pesa 48KB, pero evidentemente este no es su peso real, sino que es simplemente el "lanzador" de la aplicación.
Como se puede entender hasta aquí, la instalación de aplicaciones tiene su primer problema potencial de falta de espacio a la hora de instalarlas normalmente en el área destinada para ellas. Si instalamos 20 aplicacoines android que pesan 50MB cada una, ya tendremos ocupada todo el espacio destinado por Android para instalar aplicaciones.
Afortunadamente, Android nos ofrece una "solución" para liberar espacio interno. Si vamos a Ajustes de Sistema -- Aplicaciones, y revisamos la pestaña "En Tarjeta SD", veremos que están listadas las aplicaciones que hemos instalado en Android, y que podemos marcar el checkbox que tienen cada una de ellas.
Cuando marcamos esta casilla, indicamos a Android que mueva este programa (apk) a un directorio especial en la microsd, y con esto librerar espacio interno para instalar aplicaciones.
Al realizar este movimiento, Android deja un enlace a este contenido (un link, o acceso directo para que nos entendamos) que en este caso pesa muy poco, mientras que la aplicación se aloja en la carpeta /mnt/sdcard/.android_secure/".
Nota: Algunas aplicaciones no permiten moverlas a la memoria sdcard. También hay que considerar que si movemos una aplicación que tenga Widgets (como HD Widgets, o Evernote, por poner un par de ejemplos), no podremos utilizar los Widgets si la aplicación está en sdcard. (los widgets solo funcionan si la aplicación esta instalada en la partición destinada a aplicaciones para android)
Datos de aplicaciones
Las aplicaciones Android, muchas veces se dividen en 2 partes, la primera que es la aplicación propiamente tal, y la segunda, los datos que utiliza la aplicación.
Tomemos el ejemplo de Modern Combat 4 (MC4). La APK de esta aplicación, una vez instalada, sólo pesa 48kb, y es evidente que este NO puede ser el peso total de este juego. Cuando lo instalamos desde el market, o lanzamos el apk instalado, la aplicación comienza a descargar los datos asociados al juego que en este caso es mas de 1GB. Estos datos se almacenan en varias carpetas, dependiendo de como esté programado y configurada la aplicación.
En el ejemplo del MC4, el juego descargará los datos de recursos que, en principio, tiene todas las "versiones" o "calidades" en las que se puede ejecutar el juego (calidad baja, media, alta). Estos datos se descargan en una carpeta del juego que se encuentra dentro de "/mnt/sdcard/Android/obb".
Para que nos entendamos en términos simples, las carpetas dentro del directorio "/Android/obb" serán para nosotros como los Instaladores de las aplicaciones. Cuando un juego necesita obtener una textura o modelo, o cualquier recurso, lo buscará en este directorio.
Ahora, existe otra carpeta importante, que es la "/Android/data", y que para que nos entendamos, será el directorio donde tendremos instaladas las aplicaciones, donde tendremos los recursos listos para usar, además de donde se guardarán en algunos casos las configuraciones, avances, etc, de algunos juegos.
Siguiendo con el ejemplo del MC4, cuando lo instalamos desde el market, se descargan los datos del directorio "/Android/obb/CarpetadeljuegoMC4", y una vez descargados, el programa determina, dependiendo de las características de nuestro dispositivo (memoria, GPU, tamaño pantalla, etc) que recursos son los que va a utilizar, y copia los ficheros correspondientes desde "obb", hasta la carpeta "/Android/data/CarpetadeljuegoMC4".
Una vez desempaquetado y copiado estos ficheros en "data", la aplicación comienza su ejecución.
He de decir que no existe una regla estricta en cuanto a como deben ejecutarse las aplicaciones. Pueden existir aplicaciones que simplemente utilicen el directorio OBB directamente, obteniendo los recursos necesarios mientras accede a los ficheros (sin copiarlos la carpeta corresopndiente en "data").
También pueden existir aplicaciones que solo tengan una carpeta "Android/data", o aplicaciones que solo se ejecuten desde el apk instalado, o incluso otras aplicaciones que generen sus propios sistemas de carpetas y no utilicen ni "data" ni "obb", como puede ser Sygic Aura (que genera su propia carpeta /sdcard/Sygic" donde guarda todos sus datos)
Hasta aquí dejaré la explicación "resumida" sobre como se instalan y ejecutan las aplicaciones Android. La idea de esta sección simplemente es otorgar una idea general de como funciona Android para las personas que aun se están introduciendo en este sistema operativo.
Verificación de espacio
Antes de instalar una aplicación desde sdcard, Android primero intentará verificar el espacio disponible en sdcard para, a continuación, proceder con la instalación y descarga de datos asociados.
Así, si queremos instalar por ejemplo MC4, pero en la sdcard solo nos queda 1GB de datos, Android no nos permitirá seguir adelante hasta que liberemos espacio en donde poder descargar los datos de la aplicación.
Del mismo modo, antes de instalar la aplicación en el sistema, verificará que tengamos espacio disponible en la partición de aplicaciones, con lo que si no tenemos espacio suficiente para la aplicación, además de un porcentaje o umbral de espacio libre que necesita el sistema para poder trabajar, no podremos instalar la aplicación hasta que no liberemos espacio, ya sea moviendo aplicaciones a la sdcard o desinstalándolas directamente, para liberar el espacio necesario.
Este punto es importante a tener en cuenta, por que ya sea por una de estas dos razones podemos quedarnos sin espacio y, por lo tanto, no poder instalar aplicaciones en el sistema.
sdcard, la clave del espacio
En la sección anterior he explicado de manera general como y donde se instalan las aplicaciones Android, y como se puede ver, hay un punto importante a tener en consideración al respecto y es, como dice el título de esta sección, el punto de montaje "sdcard".
Android utiliza "sdcard" como su "disco duro propio". En cualquier instalación de Android, el sistema operativo cuenta con que por lo menos existe la entrada "/mnt/sdcard/" (o que también está enlazada como "/sdcard/" directamente).
Pueden haber muchos otros puntos de montaje, o incluso, múltiples microSD o SDCard insertadas (por ejemplo, un lector USB de tarjetas SD), pero cada tarjeta nueva o externa recibirá un nombre distinto, como puede ser:
- ext_sd
- external_sdcard
- external_sd
- extsd
- externalsd
- sdcard1
- extsdcard
- etc...
además, también podemos encontrarnos con que esta tarjeta externa puede estar montada en distintas partes, dependiendo de cada Android en particular:
- /mnt/ext_sd
- /mnt/sdcard/ext_sd
- /mnt/storages/ext_sd
- /mnt/sdcard/storages/ext_sd
- etc...
Por tanto, la memoria externa del sistema (generalmente, la microsd que insertamos) puede estar montada virtualmente en casi cualquier parte, y con cualquier nombre, y no existe una normalización al respecto.
El único punto fijo que si podemos tener claro es que siempre (o casi siempre) existe el punto "/mnt/sdcard" (o "/sdcard/"), y es por la misma razón que Android toma este punto de montaje como un lugar "seguro" y "fijo", y todo el sistema gira en torno a él.
Así, cuando movemos una aplicación desde la memoria interna (partición de aplicaciones) a la "Tarjeta SD", android no se plantea cual de todos los puntos es la memoria sd, sino que simplemente la mueve a "sdcard".
Muy bien, ahora que tenemos este concepto entendido, ya podemos empezar a imaginarnos donde está el problema de memoria que habitualmente recibimos al instalar aplicaciones, y es que como he dicho al comienzo de este articulo, Actualmente casi todos los dispositivos Android vienen con una memoria interna que ya está asignada a la microSD, y que en muchos casos, esta memoria queda ridículamente corta, por que, por ejemplo, una tablet que viene con 8GB de memoria, pero que realmente quedan disponibles 5, basta con instalar 3 o 4 aplicaciones o juegos "pesados", que cada una tenga un poco mas de 1GB, y ya no tendremos espacio para seguir instalando mas aplicaciones por que la "sdcard" se ha quedado sin espacio... y que tengamos o no insertada una microSD con muchos GB no hará ninguna diferencia en el sistema, por que sigue apuntando donde mismo, a la sdcard para instalar y utilizar como memoria de almacenamiento interno.
Así que, con todo lo anterior, podemos entender que el problema principal se puede resumir en uno solo: Cambiar el punto sdcard por nuestra microsd, para tener mas espacio, o lo que comunmente se entiende, en terminos de la comunidad Android, como hacer un "Swap de la memoria"
SWAP de la memoria, por la microSD
Hacer Swap de la memoria es, como dice el título, cambiar el punto de montaje donde tenemos la memoria interna, que Android casi siempre la establece como la "sdcard", por nuestra memoria externa que para nosotros es la microSD.
Generalmente, este cambio se hace en el fichero "/system/etc/vold.fstab", pero tiene sus puntos a considerar.
A continuación, pongo un ejemplo de un fichero vold.fstab de un dispositivo generico.
## Vold 2.0 fstab for HTC Passion
#
## - San Mehat (san@android.com)
##
#######################
## Regular device mount
##
## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>
## label - Label for the volume
## mount_point - Where the volume will be mounted
## part - Partition # (1 based), or 'auto' for first usable partition.
## <sysfs_path> - List of sysfs paths to source devices
######################
# Mounts the first usable partition of the specified device
#/devices/platform/awsmc.3/mmc_host for sdio
dev_mount extsd /mnt/extsd auto /devices/virtual/block/nandi
dev_mount sdcard /mnt/sdcard auto /devices/platform/sunxi-mmc.1/mmc_host /devices/platform/sunxi-mmc.0/mmc_host
dev_mount usbhost1 /mnt/usbhost1 auto /devices/platform/sw-ehci.1 /devices/platform/sw_hcd_host0 /devices/platform/sw-ehci.2 /devices/platform/sw-ohci.1 /devices/platform/sw-ohci.2
En el fichero anterior, he puesto en negrita los puntos de montaje corerspondientes a la sdcard (memoria interna), y la memoria externa (microSD). Para este ejemplo, la forma mas fácil de hacer el swap es cambiar los nombres de los puntos de montaje, intercambiándolos (swap) entre sí, de manera que quede algo similar a esto:
dev_mount sdcard /mnt/extsd auto /devices/virtual/block/nandi
dev_mount extsd /mnt/sdcard auto /devices/platform/sunxi-mmc.1/mmc_host /devices/platform/sunxi-mmc.0/mmc_host
dev_mount extsd /mnt/sdcard auto /devices/platform/sunxi-mmc.1/mmc_host /devices/platform/sunxi-mmc.0/mmc_host
Con el ejemplo anterior, simplemente hemos cambiado el nombre del punto de montaje de la memoria interna por la externa, y con esto conseguimos que la microSD (extsd) se monte como sdcard
Nota: Este método no es 100% seguro que funcione en todos los casos.
DirectoryBind
Esta aplicación genera "enlaces simbólicos", o "atajos directos". Para quienes entiendan mejor la terminología de Windows, es como poner un acceso directo de un elemento en el escritorio, pero que en realidad se encuentra en otra parte del disco.
En este caso, DirectoryBind solo hace enlaces (accesos directos) de directorios, asi, cuando el sistema accede a una carpeta que está enlazada, en realidad va a otra carpeta, y mira/actualiza su interior.
Con esta herramienta, generaremos una alternativa de SWAP de memoria para evitar tener que tocar ficheros del sistema (vold.fstab), y tener un resultado similar.
Para obtener este programa, mirar la sección de descargas de esta guía.
Uso de DirectoryBind como reemplazo al SWAP de memoria
Android utiliza algunas carpetas fijas para poder trabajar. Lo primero que hacemos es identificar dichas carpetas.
- /mnt/Android/data : Como he explicado anteriormente, en esta carpeta muchas aplicaciones almacenan información. Es como el directorio las aplicaciones instaladas de Android (para muchos casos).
- /mnt/Android/obb : Hemos dicho que, para resumir de forma muy general, entenderemos esta carpeta como el directorio "de instalación", es donde están los ficheros que se instalarán (en muchos casos)
- /mnt/DCIM : Directorio donde se almacenan las fotografías que tomamos con la cámara del dispositivo.
- /mnt/Gameloft : Directorio donde originalmente se instalaban las aplicaciones y juegos de Gameloft. Generalmente este directorio era muy grande, pero en las instalaciones actuales, casi todas las aplicaciones van en el directorio /Android
- /mnt/Pictures : Directorio donde se almacenan las capturas de pantallas del sistema, y algunas aplicaciones de fotografía guardan las imágenes capturadas.
Pueden haber mas directorios. He señalado los que a mi parecer son los mas importantes, y los que mas espacio pueden ocupar en "sdcard"
Descargas
DirectoryBind (de los foros XDA)
directorybind_conf.csv (configurado con punto de montaje /mnt/external_sdcard)
Fichero directorybind_conf.csv
----BASE_MOUNT_POINTS_BY_MICROSD----;;0
/mnt/external_sdcard/ANDROIDHDD/;/sdcard/ANDROIDHDD/;1
----GENERAL_BINDS----;;0
/sdcard/ANDROIDHDD/Android/data/;/sdcard/Android/data/;1
/sdcard/ANDROIDHDD/Android/obb/;/sdcard/Android/obb/;1
/sdcard/ANDROIDHDD/Gameloft/;/sdcard/Gameloft/;1
/sdcard/ANDROIDHDD/DCIM/;/sdcard/DCIM/;0
/sdcard/ANDROIDHDD/Pictures/;/sdcard/Pictures/;0
Para configurar correctamente este fichero, cambiar "/mnt/external_sdcard" por el punto de montaje del dispositivo.
Nota: Si el punto de montaje está dentro de la sdcard, poner la ruta completa, por ejemplo, si la microsd está en /mnt/sdcard/external_sd, entonces poner esa ruta completa en el fichero:
- /mnt/sdcard/external_sd/ANDROIDHDD/;/sdcard/ANDROIDHDD/;1
guardar este fichero en la raíz de sdcard. Si no estas seguro cual es tu sdcard, copia el fichero en las 2 unidades (la interna y la externa)
Ejecuta directoryBind. Verás que ya están marcados los puntos de montaje que queremos ejecutar. Puedes habilitar o deshabilitar los puntos de montaje que quieras, segun tus preferencias.
Presionar el botón "Menú", y en el menú que aparece, seleccionar "Bind all checked".
Si todo es correcto, veremos los enlaces que se han creado con un icono verde.
Ya tenemos hecho nuestro "Swap" a la memoria microSD!
Nota:
He generado un punto de montaje en "/sdcard/ANDROIDHDD", para que sea mas fácil cambiar la configuración del fichero, modificando solo una línea (la parte que corresopnde a la ubicación de la microsd). Si no lo hago de esta manera, tendríamos que generar un fichero simiar a este:
/mnt/external_sdcard/Android/data/;/sdcard/Android/data/;1/mnt/external_sdcard/Android/obb/;/sdcard/Android/obb/;1/mnt/external_sdcard/Gameloft/;/sdcard/Gameloft/;1/mnt/external_sdcard/DCIM/;/sdcard/DCIM/;0/mnt/external_sdcard/Pictures/;/sdcard/Pictures/;0
Con lo que tendríamos que cambiar todos los puntos de montaje "/mnt/external_sdcard" con lo que tendríamos que cambiar todos los puntos de montaje en el fichero. Generando un segundo directorio al que apunte la estructura, solo nos basta con cambiar una línea, y todo el sistema de directorios se actualizará a dicho punto de montaje.
Consideraciones
Mas arriba en este artículo comenté que Android verifica 2 puntos para ver si existe espacio disponible para instalar aplicaciones, la partición para aplicaciones, y la sdcard.
Cuando tenemos activo el Swap, el sistema Android sigue verificando nuestra sdcard para ver si hay espacio disponible para instalar aplicaciones.
Dicho lo anterior, si no utilizamos la memoria interna para copiar ficheros, en el caso de un dispositivo que tenga 5GB libres (por poner un ejemplo), seguirán quedando siempre 5GB libres, por lo que la comprobación de espacio siempre dirá que hay suficiente espacio para instalar, por lo menos, una aplicación de hasta 5GB de datos para descargar, lo que es MUCHO, y con esto nos aseguramos que nunca tengamos el mensaje de que no existe espacio en la sdcard para descargar una aplicación.
Hasta donde yo se, en mis instalaciones la aplicación que mas datos utiliza es el juego Bard's Tale, que si nos descargamos la versión de gráficos HD, tenemos que la instalación ocupa unos 3.5GB en total.
Hay que tener en cuenta que el sistema no verificará el espacio disponible realmente en la microSD, por lo que si no tenemos espacio para instalar la aplicación, Android nos dará algún error pero, no nos especificará que no tenemos espacio para la instalación (posiblemente sea un error relacionado con el acceso a disco, o un error genérico)
Otros tipos de SWAP
Así como podemos apuntar el contenido de algunas carpetas a la microSD o memoria externa, también podemos hacer otros tipos de SWAP, por ejemplo, apuntar las carpetas para que obtengan la información desde un pendrive o disco duro USB, con lo que si tenemos un Set Top Box, o un Android TV, en vez de utilizar una MicroSD para almacenar información, podemos utilizar directamente un pendrive, con lo que tendremos el mismo efecto que si fuese una microSD.
Basta cambiar la ruta de montaje principal, por la ruta que queramos utilizar:
- /mnt/usbhost/ANDROIDHDD/;/sdcard/ANDROIDHDD/;1
Nota: Cambiar por la ruta correspondiente al dispositivo. Este es sólo un ejemplo.
Con lo anterior, ya tenemos todo cambiado para que apunte a nuestro pendrive o disco duro por USB.
Del mismo modo, y con algunas herramientas mas como el soporte CIFS, se pueden montar sistemas mas complejos y funcionales como el que he explicado en mi artículo de CIFS&BIND, que no es mas que el mismo SWAP con DirectoryBind, pero utilizando un recurso de red como tarjeta externa o sdcard.
Palabras finales
Espero que esta guía sea de interes y provecho, en especial para quienes se estén introduciendo al mundo Android.
No soy experto y posiblemente los términos que utilizo no son los correctos, pero me he tomado la libertad de explicar las cosas lo mas simple posible, utilizando como analogía en parte a Windows, que es un sistema que muchos usuarios (la mayoría) ya conocen, y por tanto portar los conceptos existentes en el (como la idea de enlaces directos para los directorios) creo que será mas clara para entender y poner en práctica lo que he explicado en este artículo.
Comentar si es que hay cualquier error que necesite ser corregido. Agradeceré cualquier tipo de corrección y aporte que se pueda hacer a este artículo.
Zalu2!
Deen0X