Android: Manque de place sur mémoire interne ? Utilisez l'espace de la carte microSD


Robot android

Certains téléphones Android ont une mémoire interne montée sur /sdcard et une carte SD externe montée sur /sdcard2. C'est le cas du Acer Gallant Duo (E350) que je me suis offert. Il a 1go de mémoire interne et une sdcard de 16go dans mon cas.

Votre /sdcard devient plein alors que vous avez plein de place sur /sdcard2 ?

Cet article est fait pour vous !


Problème: Certaines applications Android écrivent sur /sdcard qui correspond à la carte SD interne et saturent l'espace. C'est le cas par exemple de Google Play Music qui écrit son cache sur /sdcard/Android/data/com.google.Android.music et qui sature vite l'espace.

Le but: Libérer de la place sur la carte SD interne en utilisant l'espace disponible sur la carte SD externe.

La solution: Monter des dossier de la carte SD externe sur un dossier de la carte SD interne (bind mounts). L'application écrira toujours dans /sdcard mais les données seront écrites sur la carte SD externe.

Prérequis:

  • Le téléphone doit être rooté. Pour le Acer Gallant Duo, j'ai utilisé cette méthode (c'était la version 11 à ce moment-là).
  • Installez Script Manager et un explorateur de fichiers (ES est bien) sur votre téléphone

Tuto:

Dans ce tuto, je prendrai pour exemple le cache de Google Play Music mais cela fonctionne pour toutes les applis. Par exemple, une appli GPS qui doit stocker des cartes volumineuses.

  • Forcez l'arrêt de l'application, effacez les données et effacez le cache dans Réglages -> Applications

[donnees

  • Naviguez sur votre carte SD interne avec un explorateur et supprimez les données précédemment écrites par l'application. Ne supprimez pas le dossier mais seulement les données. Dans le cas de Google Play Music il faut supprimer les dossiers artwork et music dans /sdcard/Android/data/com.google.android.music/cache
  • Créez un dossier sur la carte SD externe (/sdcard2) pour accueillir les données. Par exemple /sdcard2/data/GoogleMusicCache
  • Sur votre carte SD interne, créez un nouveau fichier texte, appelez-le mount_binds.sh . A l'intérieur, collez une ou plusieurs lignes du type:

mount -o bind /mnt/sdcard2/data/GoogleMusicCache/ /mnt/sdcard/Android/data/com.google.Android.music/

  • Lancez Script Manager, trouvez le script que vous venez de créer, laisser appuyé dessus et sélectionnez "Open As..." et choisissez "Script/Executable"
  • Cochez "SU" (pour lancer le script en tant que root) et "Boot" (pour le lancer au démarrage) puis "Enregistrer". Vous pouvez aussi cliquer sur Run pour le lancer et faire les montages tout de suite.

script

Et voilà, maintenant l'application écrira toujours sur /sdcard mais les données seront réellement écrite sur la SD externe. Vous pouvez traquer les applis qui pourraient saturer la mémoire interne avec Disk Usage et faire la même manipulation avec d'autres dossiers.

Perso, j'ai redirigé vers la SD externe le cache Google Music, les téléchargements Google Listen et les screenshots (je veux qu'ils soient dans /sdcard2/DCIM pour qu'ils soient uploadés sur G+ avec Instant Upload).

Bonus:

J'ai fais un script en Python qui permet de vérifier que les montages soient bien présents. S'ils ne sont pas présents, ils sont montés.

A lancer avec sl4a avec l'interpréteur Python installé.

import android
droid=android.Android()
import time
import commands

status,output = commands.getstatusoutput("mount | busybox grep -q com.google.Android.music") 
if status == 0:
    droid.makeToast("Cache Google Music deja monte")
else:
    status2,output2 = commands.getstatusoutput("su -c mount -o bind /mnt/sdcard2/data/GoogleMusicCache/ /mnt/sdcard/Android/data/com.google.Android.music/")
    if status2 == 0:
        droid.makeToast("Montage cache Google Music OK")
    else:
        droid.notify('Montage KO !', 'Cache Google Music')
time.sleep(1)

status,output = commands.getstatusoutput("mount | busybox grep -q com.google.android.apps.listen")
if status == 0:
    droid.makeToast("Google Listen deja monte")
else:
    status2,output2 = commands.getstatusoutput("su -c mount -o bind /mnt/sdcard2/com.google.android.apps.listen/ /mnt/sdcard/com.google.android.apps.listen/")
    if status2 == 0:
        droid.makeToast("Montage Google Listen OK")
    else:
        droid.notify('Montage KO !', 'Cache Google Music')
time.sleep(1)

status,output = commands.getstatusoutput("mount | busybox grep -q Screenshots")
if status == 0:
    droid.makeToast("Screenshots deja monte")
else:
    status2,output2 = commands.getstatusoutput("su -c mount -o bind /mnt/sdcard2/DCIM/Screenshots/ /mnt/sdcard/Pictures/Screenshots/")
    if status2 == 0:
        droid.makeToast("Montage Screenshot OK")
    else:
        droid.notify('Montage KO !', 'Screenshots')

Commentaires