27
Juil
2012
Tutoriel Android : déplacer des données d'applications sur la carte mémoire externe Imprimer
Depuis peu, je suis l'heureux propriétaire d'un téléphone / ordinateur de poche : le fameux Samsung Galaxy Note et son écran géant ! Et comme je suis (un peu ?) un bidouilleur, je n'ai pas pu m'empêcher de rentrer directement dans le coeur de la bête. Il est proposé par défaut avec le système Android Gingerbread 2.3.6, basé sur un noyau GNU/Linux.

Le problème avec ces appareils, c'est qu'on n'a pas par défaut la main sur tout le système : il n'est pas possible d'obtenir les droits super-utilisateur comme sous un vrai système GNU/Linux. Mais il y a plein d'astuces en ligne qui permettent de d'y remédier et d'ajouter cette possibilité. Ce n'est pas le but de cet article, il y a déjà ce tout qu'il faut en ligne. Par exemple ce tutoriel qui a très bien marché dans mon cas.

Une autre chose énervante, c'est que la plupart des applications installées stockent leurs données sur la mémoire interne de l'appareil et pas sur la carte mémoire externe que j'ai ajouté. Comme il y a 12Go en interne et que j'ai mis une carte externe de 32Go, c'est quand même un peu bête ! Ce que je vous propose dans cet article, c'est une astuce qui permet de tromper les applications en délocalisant leurs données dans la carte externe sans qu'elles n'y trouvent rien à redire ! Sourire


Pour commencer, il faut impérativement que votre Android soit rooté pour que tout ce qui suit puisse marcher. Vous pouvez utiliser le tutoriel que j'ai indiqué ci-dessus ou chercher sur internet, les docs à ce sujet ne manque pas ! Si vous ne souhaitez pas rooter votre appareil, il faudra malheureusement passer votre chemin, cet article n'est pas pour vous ! Ensuite, il vous faudra installer 2 applications gratuites disponibles sur le Google Play (la boutique officielle des applications Android) :
Autostart (Root)
Android Terminal Emulator
Ce n'est pas indispensable, mais pour plus de confort avec la frappe au clavier dans le terminal, je vous conseille également le Hacker's Keyboard.

Le principe est de permettre à des applications hébergeant leurs données sur la mémoire interne du téléphone (partition système ou carte interne) de continuer à fonctionner tout en stockant leurs données sur une carte mémoire externe. Par exemple, pour l'application de navigation routière NavFree, les données OpenStreetMap de la France entière pèsent 1.2Go et elles sont forcément stockées par l'application dans un répertoire en interne. J'aimerai vraiment stocker ça sur ma carte externe de 32Go, surtout si je souhaite un jour rajouter d'autres pays ! Le répertoire interne qui contient les données d'applications se trouve ici : /mnt/sdcard/Android/data. Je souhaite les transférer dans /mnt/sdcard/external_sd/data.

Première solution : utiliser un lien symbolique


Une première solution à laquelle j'ai pensé serait de faire un lien symbolique de /mnt/sdcard/Android/data vers /mnt/sdcard/external_sd/data. Mais malheureusement ce n'est pas possible car la partition de la carte externe est en FAT32 et que ce système de fichiers ne gère pas les liens symboliques. Et il n'est pas possible de mettre un autre système de fichier pour la carte externe sous Android.

Deuxième solution : créer un point de montage


Il s'agit de lier le répertoire interne à celui de la carte externe en utilisant un point de montage avec la commande mount. C'est l'idée qui est proposée sur cette page.


1) Transférer le répertoire des données d'applications sur la carte externe


Sur votre Android, ouvrez la console Terminal Emulator.
Passez en super-utilisateur avec la commande su puis créer le répertoire data dans la carte externe :
su
mkdir /mnt/sdcard/external_sd/data

Il se peut que ce répertoire existe déjà (oui il y des applications intelligentes qui installent leur données dans la carte externe !). Dans ce cas, ne pas tenir compte du message d'erreur et continuer avec ce qui suit.
Copiez les données sur la carte externe :
cp -R /mnt/sdcard/Android/data/* /mnt/sdcard/external_sd/data

Cela peut prendre du temps si il y a beaucoup de données, soyez patient !
Renommer temporairement l'ancien répertoire des données (tout à l'heure on supprimera ce répertoire si tout se passe bien) :
mv /mnt/sdcard/Android/data /mnt/sdcard/Android/data-OLD


2) Créer le point de montage vers le nouveau répertoire de la carte externe


Toujours en super-utilisateur sous la console, tapez :
mkdir /mnt/sdcard/Android/data
mount -o bind /mnt/sdcard/external_sd/data /mnt/sdcard/Android/data

Naviguez dans le répertoire monté pour vérifier que tout s'est bien passé :
cd /mnt/sdcard/Android/data
ls

Vous devriez voir toutes les données qui pourtant se trouvent bien dans external_sd. Si c'est bien le cas, vous pouvez supprimer le répertoire de sauvegarde qu'on avait laissé sur la mémoire interne (attention de ne pas vous tromper de répertoire !) :
rm -rf /mnt/sdcard/Android/data-OLD

Si vous vérifier l'espace occupé dans la mémoire interne, vous verrez que vous avez gagné tout ce qui était dans le répertoire data. Espace qui a bien entendu été perdu dans la carte externe !
Vous pensez que tout est bon maintenant. Hé bien non... Essayez de redémarrer complètement votre téléphone (pas simplement une mise en veille mais un redémarrage complet), et vous verrez que le montage a disparu ! Ce qui est normal car les points de montage créé à la main par la commande mount ne sont valables que pour la session en cours.
Mais il y a une astuce qui permet de lancer la commande de montage au démarrage du système.


3) Recréer le point de montage à chaque démarrage du système


Pour pouvoir recréer le point de montage à chaque redémarrage, il faut utiliser une application qui permet de lancer l'exécution de commandes. C'est justement ce que fait l'application Autostart. Au démarrage, cette application lance les commandes qui sont écrites dans le fichier /data/opt/autostart.sh. Il faut créer le répertoire opt dans /data soit avec votre explorateur de fichiers, soit en ligne de commande :
cd /data
mkdir opt

Reste ensuite à remplir le fichier autostart.sh avec la commande de montage. Pour cela, vous pouvez créer un nouveau fichier autostart.sh dans le répertoire /data/opt, puis y saisir la commande de montage comme ceci :
su
mount -o bind /mnt/sdcard/external_sd/data /mnt/sdcard/Android/data

Ou si vous préférez tout faire en ligne de commande :

cd /data/opt
echo "su" > autostart.sh

echo "mount -o bind /mnt/sdcard/external_sd/data /mnt/sdcard/Android/data" >> autostart.sh

Puis il faut donner tous les droits sur le fichier et le répertoire créé :
cd /data
chmod -R 777 opt

Et c'est gagné ! Vous pouvez essayer de redémarrer complètement le téléphone et vous verrez dans /mnt/sdcard/Android/data que le répertoire est bien remonté vers celui qui se trouve dans la carte externe. Testez quelques applications pour vérifier que tout va bien. En tout cas avec NavFree et les autres applications que j'ai installé pas de problème ! Sourire

Si vous avez des remarques ou des suggestions, je suis preneur. Je me suis peut-être compliqué la vie sur certains points, mais pour le moment je ne connais pas encore bien toutes les astuces Android.