Para GNU/Linux. La idea es sencilla: un script BASH que mediante el uso de ADB (Android Debug Bridge) mantenga una o varias carpetas sincronizadas entre nuestro Android y el ordenador de tal manera que siempre dispongamos de una copia en nuestro disco duro y esta se realice de manera automática (sin más intervención manual que conectar el teléfono al USB para cargarlo) y rápida.
En el siguiente vídeo se ve como funciona y como la sincronización es bastante rápida.

Idealmente esto lo empecé para mantener a mano en el ordenador las fotografías y vídeos que grabo con mi móvil (un Android – HTC Wildfire S) pero en realidad nada impide que esto puede ser usado para sincronizar otros contenidos ó simplemente como un modo cómodo de traspasar archivos al teléfono habitualmente para usarlo como pendrive.

La alternativa más evidente a este uso de ADB para sincronizar dos carpetas sería el montaje del teléfono como unidad de disco duro externo y a continuación usar alguna aplicación como sync para la sincronización, pero hay un par de ventajas a favor de ADB abismales: en el tiempo que tarda el teléfono en desmontar y montar en el PC la nueva unidad como un disco duro de nuestro ordenador he acabado yo de transferir alrededor de 200 Mg de archivos. La velocidad de transferencia es idéntica pero la conexión en inmediata (un par de segundos. Actualmente mantengo sincronizados 15 carpetas que contienen 250 archivos. Desde que conecto el teléfono al USB y aparece el diálogo informando de “No es necesaria la sincronización” pasan aprox. 6 seg).
Además de la velocidad, al no estar la tarjeta del teléfono montada como un disco duro/pendrive se gana en seguridad frente a archivos corruptos o desmontajes inapropiados. Si tienes que irte de improviso simplemente desconectas el teléfono y te lo llevas.

El único engorro es instalar ADB que viene con el kit de desarrollo de Android distribuido por Google. Si no las tienes ya instaladas simplemente sigue los pasos que se indican en la sección “Descargar Android SDK

Preparar el móvil

La única preparación o instalación en el teléfono móvil es dejar activa por defecto la depuración USB de tal manera que siempre que se conecte esté accesible de forma inmediata para la aplicación ADB. Para activar la depuración usb, en tu teléfono busca y activa: Ajustes->Aplicaciones->Desarrollo->Depuración USB

Preparar el PC

En tu ordenador la única tarea extraordinaria (si no has hecho todavía) es asegurar que el ejecutable de ADB está accesible para todo el sistema. En mi caso ADB está instalado en /usr/bin.

Identificar tu Android

A continuación necesitamos algunos datos con los que reconocer cuando nuestro teléfono ha sido conectado al USB del ordenador.
Conecta el móvil vía USB, abre una konsola/terminal y escribes dmesg. Verás algunas líneas de información detectando la conexión de un nuevo dispositivo USB. Busca la línea que indica idVendor y idProduct. Copia y guarda esa información en un archivo de texto para usarla a continuación.

Reglas para UDEV

UDEV es el servicio encargado en la mayoría de los Linux modernos de registrar y administrar la conexión de dispositivos al ordenador. Mediante un serie de reglas indicamos a UDEV que es lo que tiene que hacer cuando detecte que se ha conectado/desconectado tal o cual dispositivo.
Las reglas UDEV estan normalmente (en openSuse 11.3) en el directorio /etc/udev/rules.d. En dicho directorio veréis una lista de archivos de texto que configuran el comportamiento de UDEV. Para no alterar archivos de sistema ya existentes lo ideal es crear nuestro propio archivo (como root) conteniendo nuestras reglas personalizadas y a continuación situarla al final de la lista de archivos existentes simplemente asignándole un nombre único tal como “99-mis reglas.rules” que lo situa al final de la lista.

(todas las operaciones siguientes se realizan como administrador, sudo) Si ya tienes tu archivo de reglas personales edítalo, de lo contrario crea uno con la siguiente línea:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="XXXXX-ID-VENDOR", ATTRS{idProduct}=="XXXXX-ID-PRODUCT", ACTION=="add", RUN+="/bin/su mi-usuario -c '/home/mi-usuario/bin/sincro-movil'"
Reemplaza XXXX-ID-PRODUCT y XXXX-ID-VENDOR por los valores de tu dispositivo obtenidos en el paso anterior y mi-usuario por tu nombre de usuario.

En un terminal recarga las reglas conudevadm control --reload-rules

Probando la detección

Bien, vamos a comprobar que todo funciona como debe y que UDEV detecta y ejecuta el script correctamente, creamos un script que más tarde completaremos y lo guardamos con el nombre usado en el punto anterior (/home/mi-usuario/bin/sincro-movil) con el siguiente contenido:#!/bin/bash
echo "Hola móvil" > /home/mi-usuario/Desktop/movil.conectado
Haz ejecutable el script (chmod +x /home/mi-usuario/bin/sincro-movil).
Una vez hecho esto conecta tu teléfono al puerto USB, en un par de segundos debería aparecer en tu escritorio una archivo de texto llamado “móvil.conectado“. Si no es así comprueba las rutas de archivos, nombres de archivos, etc…
Una vez que tienes tu script creado, funcionando y ejecutado correctamente desde UDEV pasamos a llenarlo de contenido.

Script de sincronización

El script que utilizo para la sincronización podéis copiarlo/descargarlos desde aquí sincroMovil (txt).
Guardad el contenido como (p.ejem) sincroMovil en vuestra carpeta ~/bin (o donde le indicasteis en el paso anterior a UDEV) y hacedlo ejecutable (chmod +x ~/sincroMovil). Editadlo y corregid las líneas que requieren personalizarse, las carpetas que quereis sincronizar, etc…

En este vídeo podéis ver el script en funcionamiento. Tomar una foto de la pantalla, conectar el teléfono y tener la imagen en el escritorio en unos segundos.

Android sincronizadoSincronización: Básicamente el script lo que hace es generar un par de listas de archivos para cada una de los directorios a sincronizar. Ambos archivos se guardan en local (por rendimiento) y bajo los nombres (personalizables) de sincro.list y sincro.list.remota. Cuando el script se ejecuta (porque UDEV ha detectado la conexión o bien lo lanzamos manualmente) se recrean de nuevo ambas lista y se comparan mediante DIFF. Este archivo de diferencias define si es necesario el copiado de archivos y la dirección del mismo (del teléfono al PC ó viceversa) o simplemente se emite un diálogo avisando de que no es necesaria la sincronización.

Borrado local: Antes de hacer esto el script comprueba si falta algún archivo en local desde la última sincronización (es decir, se ha borrado manualmente) y caso de detectar que falta algún archivo lo borra también en el teléfono. Pero no a la inversa. Es decir, si borramos un archivo en local se borrará en el teléfono en la siguiente sincronización, pero si lo borramos en el teléfono únicamente el fichero se volverá a copiar a este en cuanto lo enchufemos al PC.
He hecho esto así porque parece más cómodo eliminar imágenes y vídeos desde el escritorio que desde el teléfono. Tiene el inconveniente de que no podremos eliminar un archivo desde el teléfono si este se encuentra en una carpeta sincronizada ya que a cada conexión se volverá a copiar desde el PC. Esto en realidad no es un bug sino una feature. :D

Si queréis anular esta función de borrado basta con comentar la línea 156 del script.

Mejoras

La principal mejora a introducir sería el refresco de la caché del teléfono. Actualmente el teléfono no se entera de los cambios ocurridos en su sistema de archivos (al menos en las galerías de fotos que mantengo sincronizadas). Si borramos un archivo en local y sincronizamos las carpetas, el teléfono sigue mostrando la miniatura de una imagen que ya no existe y emite un error al tratar de abrirla.
Si enviamos algún archivo al teléfono no aparece en la lista hasta que la caché se refresca.

Debe haber alguna manera de forzar el refresco de la caché pero he sido incapaz de encontrarla. Se agradece cualquier información.