web-dev-qa-db-fra.com

Solution à l'erreur INSTALL_FAILED_INSUFFICIENT_STORAGE sur Android

L'erreur INSTALL_FAILED_INSUFFICIENT_STORAGE est le fléau de la vie de chaque développeur Android. Cela se produit indépendamment de la taille de l'application ou de la quantité de stockage disponible. Le redémarrage du périphérique cible résout le problème brièvement, mais il revient rapidement. Il y a des centaines (si ce n'est des milliers) de messages dans le forum de messages de personnes se demandant pourquoi le problème se pose, mais les employés de Google restent silencieusement frustrés sur le sujet.

Il existe une solution de contournement simple. Si votre périphérique de test exécute Android 2.2 ou version ultérieure, ajoutez l'attribut Android:installLocation au fichier manifeste de votre application, avec la valeur "preferExternal". Cela forcera l'application à être installée sur le stockage externe de l'appareil, tel qu'une carte SD d'un téléphone.

Par exemple:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="com.andrewsmith.Android.darkness"
          Android:installLocation="preferExternal"

Il s’agit plus d’un pansement que d’un correctif, et cela peut ne pas être idéal si vous souhaitez que votre application finie soit installée sur la mémoire interne de l’appareil. Mais au moins, cela rendra le processus de développement beaucoup moins frustrant.

495
Andrew Smith

Ce n'est qu'une solution de contournement temporaire et non un véritable correctif.

Après que cela m'est arrivé et que je ne sois pas satisfait des réponses actuelles, je me suis mis au travail pour essayer de le résoudre à partir de la source AOSP. J'ai trouvé une solution RÉELLE.

Explication

Tout d'abord, un peu de contexte (simplifié) sur la façon dont Android installe et met à jour

La première fois qu'une application est installée:

  1. Le fichier APK est enregistré sous le nom

    /data/app/-1.apk (1.apk)

Lorsque l'application doit être mise à jour:

  1. Le fichier APK mis à jour est enregistré en tant que:

    /data/app/-2.apk (2.apk)

  2. La première version (1.apk) est supprimée.

Sur nos prochaines mises à jour:

  1. Le nouveau fichier APK est enregistré en tant que (1.apk) et (2.apk) est supprimé (Répéter pour toujours).

Le problème rencontré par la plupart d'entre nous se produit lorsque l'application est mise à jour, mais la suppression de l'ancien APK échoue. Ce qui en soi ne provoque pas encore l'échec de la mise à jour, mais il y a deux fichiers APK dans /data/app.

La prochaine fois que vous tenterez de mettre à jour l'application, le système ne pourra pas déplacer son fichier temporaire car ni (1.apk) ni (2.apk) ne sont vides. Puisque File # renameTo (File) ne lève pas d'exception mais retourne un booléen PackageManager, il n'a aucun moyen de dire pourquoi il retourne INSTALL_FAILED_INSUFFICIENT_STORAGE même si l'échec n'avait rien à voir avec la quantité d'espace libre.

Solution

Courir:

adb Shell "pm uninstall <full.packge.name>"
adb Shell "rm -rf /data/app/<full.package.name>-*"

OU

Désinstaller l'application

Utilisez votre méthode préférée pour supprimer LES DEUX:

/data/app/<full.package.name>-1.apk

/data/app/<full.package.name>-2.apk

Assurez-vous que rien d'autre ne bloque les installations futures de la même manière. Dans mon cas, un répertoire /data/app-lib/<full.package.name>-1 traînait! Dans ce cas, une installation sur carte SD a fonctionné, puis un déplacement ultérieur dans la mémoire interne. (Création de /data/app-lib/<full.package.name> sans la fin -1.)

Pourquoi d'autres "solutions" ont fonctionné

  • Le code d'installation sur un stockage externe est très différent, ce qui ne pose pas les mêmes problèmes

  • La désinstallation de l'application ne supprime qu'une version du fichier APK dans /data/app. C'est pourquoi vous pouvez le réinstaller une fois, mais pas le mettre à jour.

  • La quantité d'espace libre dans un émulateur n'est pas vraiment pertinente lorsque ce bogue survient

164
gabcas

Vous devez augmenter la capacité de mémoire de l'émulateur Android. Il y a deux façons pour cela:

  1. Cliquez avec le bouton droit de la souris sur la racine de votre projet Android, accédez à "Exécuter en tant que", puis "Exécuter les configurations ...". Recherchez le nœud "Application Android" dans l'arborescence située à gauche, puis sélectionnez votre projet et accédez à l'onglet "Cible" situé à droite de la fenêtre. Recherchez le champ "Options supplémentaires de la ligne de commande de l'émulateur" (parfois Il faudra agrandir la fenêtre) et enfin coller "-partition-size 1024". Cliquez sur Appliquer puis sur Exécuter pour utiliser votre émulateur.

  2. Allez à Préférences d'Eclipse , puis sélectionnez "Lancer" Ajoutez "-partition-size 1024" dans le champ "Option de l'émulateur par défaut". Cliquez sur "Appliquer" et utilisez votre émulateur comme d'habitude.

108
Oscar S.

Merci d'avoir posté cette question. J'ai quelques idées supplémentaires qui pourraient aider certains développeurs.

Je débogue mon application sur un périphérique (pas l'émulateur). L'appareil dispose de 21 Mo libres sur /data (comme indiqué par "df" lorsque vous exécutez "adb Shell") et mon application ne fait que 5 Mo. Cependant, j’ai constaté que si je supprimais d’autres applications de l’appareil (sans redémarrer le téléphone ni redémarrer adbd), INSTALL_FAILED_INSUFFICIENT_STORAGE s’éloignait pendant un moment, puis revenait.

Il semble donc que le débogage de mon application de 5 Mo nécessite plus de 20 Mo d’espace dans /data, et qu’en plus, quelque chose fuyait à chaque débogage de mon application.

Alors j'ai fait "adb Shell" et répertorié le répertoire ENTIRE /data avec

cd /data
ls -a -l -R

Et j'ai regardé la sortie de 5000 lignes pour voir où tout l'espace allait.

J'ai découvert de grandes quantités d'espace gaspillé sur mon appareil dans le répertoire /data/klog sous la forme d'anciens fichiers journaux issus de sessions de débogage vieilles de plusieurs mois.

Ce ne sont pas mes fichiers journaux: ils ont été créés par une partie de l'infrastructure Android.

Je les ai supprimés et j'ai instantanément enregistré 58 Mo qui n'étaient attribués dans l'application Réglages à aucune application en particulier. J'ai un petit appareil donc 58 Mo est très important (environ 40%).

Jusqu'à présent, INSTALL_FAILED_INSUFFICIENT_STORAGE ne m'a plus été utilisé après de nombreuses exécutions. Espérons que cela soit le vrai problème, bien que le PO suggère que son appareil dispose de beaucoup d'espace (mais ne dit pas combien).

Espérons que certains d'entre vous pourront également échapper à INSTALL_FAILED_INSUFFICIENT_STORAGE en supprimant périodiquement /data/klog/*.

Ou, vous pouvez au moins faire le ls -a -l -R dans /data pour voir où va tout votre espace, s'il existe vraiment un problème d'espace (caché).

28
Louis Semprini

Les aides suivantes:

  • Ouvrir un shell sur le périphérique

    adb Shell
    
  • Naviguez jusqu'au répertoire temporaire où le fichier APK entrant est copié pour la première fois

    cd /data/local/tmp
    
  • Répertoriez les fichiers disponibles et supprimez-les comme vous le souhaitez

    rm * // use at your own risk, good practice to list files first
    

Cela a été fiable pour moi jusqu'à présent sur un appareil réel.


EDIT: Cette solution s'est avérée moins fiable que celle présentée ci-dessus.

J'ai essayé plusieurs solutions. Rien n'a vraiment aidé. Enfin, j'ai trouvé une application appelée SD Maid . Cela a aidé.

Il dit que la fonctionnalité est limitée sur les appareils non racinés. Le mien est enraciné, alors il serait bon d'entendre les gens dire que c'est efficace dans ces scénarios et que si c'était juste un coup de chance, cela a fonctionné pour moi (c'est un problème imprévisible de toute façon).

REMARQUE: Je n'ai rien à voir avec l'application. Je viens de le trouver avec une recherche.

20
Saad Farooq

J'avais ajouté une ligne supplémentaire au fichier manifeste de l'application, qui est Android:installLocation="preferExternal". en utilisant cette ligne, il oblige à installer l'application sur le stockage externe. voir l'exemple ci-dessous,

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.nasir.phonegap"
    Android:installLocation="preferExternal" >
16
nasirkhan

Je l'ai résolu en incluant Android:installLocation="auto" à l'intérieur de la balise <manifest> dans le fichier AndroidManifest.xml.

15
user3278416

Un problème connexe sur l'émulateur survient lorsqu'il ne reste plus aucun espace dans la partition /data.

Par exemple,

% adb Shell df

Filesystem             Size   Used   Free   Blksize
/dev                   252M    32K   252M   4096
/mnt/asec              252M     0K   252M   4096
/mnt/obb               252M     0K   252M   4096
/system                154M   154M     0K   4096
/data                   64M    57M     6M   4096
/cache                  64M     1M    62M   4096

Voici un exemple de vue du répertoire /data/app:

% adb Shell ls -l /data/app

-rw-r--r-- system   system      19949 2011-10-12 17:09 CubeLiveWallpapers.apk
-rw-r--r-- system   system      27670 2011-10-12 17:09 GestureBuilder.apk
-rw-r--r-- system   system      34341 2011-10-12 17:09 SoftKeyboard.apk
-rw-r--r-- system   system      20151 2011-10-12 17:09 WidgetPreview.apk

J'ai supprimé les fichiers supplémentaires APK . Il semble que sur chaque installation, vous obtenez un nouveau fichier APK. Supprimez simplement les fichiers APK supplémentaires.

Par exemple,

adb Shell rm /data/app/com.brooklynmarathon.calendarapi2-1.apk
9
Ralph Yozzo

Dans mon cas, l'échec a été causé par com.Android.providers.media app. J'ai fait face à cela sur l'émulateur x86 Android. Qu'est-ce que j'ai fait:

$ adb Shell df
Filesystem             Size   Used   Free   Blksize
...
/data                  224M   209M    14M   4096
....

Espace libre insuffisant sur /data

$ adb Shell du /data
...
409870  /data/data/com.Android.providers.media
...

Presque tout a été consommé par une seule application! C'est une application système donc je pense qu'il vaut mieux ne pas la supprimer. Au lieu de cela, j'ai nettoyé les données de l'application.

$ adb Shell pm clear com.Android.providers.media
Success
$ adb Shell df
Filesystem             Size   Used   Free   Blksize
...
/data                  224M     8M   215M   4096
...

Le disque a été effacé et l'application installée avec succès.

9
Sergey Fedorov

Répondre au tout premier message de ce sujet ...

Symptôme: Certaines applications ne s’installent pas, affirmant qu’il n’ya pas d’espace et qu’il ya beaucoup d’espace libre sur le stockage interne et externe !!! Solution: désactiver l'installation externe par défaut.

Paramétrer une installation externe par defaut avec ceci:

adb Shell pm set-install-location 2

Rend l'installation impossible sur de nombreuses applications qui ne peuvent pas installer en externe (comme adblock + ou plus)

Alors la solution est

adb Shell pm set-install-location 0

Ou

adb Shell pm set-install-location 1

0: auto (if one is full - or irrelevant !!! - it select the other)
1: internal
2: external
6
dan

Je me sens un peu bizarre en écrivant cela, mais je ne peux pas être sûr à 100% que c'est pas vrai dans dans certains cas (cela a fonctionné pour moi). Si vous avez eu les symptômes suivants:

  • Vous travaillez avec un périphérique physique (dans mon cas, le Samsung Galaxy Ace),
  • Vous avez développé pendant quelques jours d'affilée,
  • Votre téléphone a été connecté tout le temps, jour et nuit.
  • Vous avez commencé à avoir cette erreur après quelques jours, et cela a continué à empirer.
  • Aucun des autres réponses a fonctionné pour vous.
  • Tu es aussi résigné que j'étais ...

Ensuite, essayez ceci:

  • Débranchez votre téléphone lorsque vous ne travaillez pas!

Je débranche mon téléphone et le laisse reposer toute la journée. Ma batterie s'est usée un peu. Après cela, je l'ai reconnecté et j'ai relancé le débogage. Tout a bien fonctionné cette fois! Et je veux dire vraiment très bien, juste comme avant.

Est-il possible que cette erreur soit due à un matériel lié à la batterie? C'est toujours bizarre de penser de cette façon, mais maintenant je déconnecte mon téléphone de temps en temps (et pour la nuit) et le problème ne s'est pas reproduit.

6
wrygiel

Samsung Galaxy Ace annonce 158 Mo de stockage interne dans ses spécifications, mais les applications et services de base consomment environ 110 Mo de celui-ci (j'ai utilisé le gestionnaire de tâches l'appareil pour l'inspecter). Mon application faisait 52 Mo, car elle avait beaucoup d’actifs. Une fois que j'ai supprimé certains de ceux-ci jusqu'à 45 Mo, l'application a réussi à installer sans problème. L'appareil m'avertissait toujours que le stockage interne était presque plein et que je devais désinstaller certaines applications, même si je n'avais qu'une seule application installée.

Après avoir installé une version finale de l'ensemble .apk, puis l'avoir désinstallée, mon appareil affiche 99 Mo d'espace disque disponible. Il est donc possible qu'il débogue des informations qui encombrent l'appareil. Voir réponse de Louis Semprini .

5
snez

Dans Eclipse,

Run -- > Debug Configurations --> Select "target", et sélectionnez une cible d'émulateur préférée à lancer.

Ensuite, sous cette "option supplémentaire de la ligne de commande de l'émulateur", ajoutez ceci:

- taille de partition 1024

Ensuite, fermez l'émulateur et cliquez sur l'icône de débogage, ce qui lancera l'émulateur préféré que vous avez sélectionné.

enter image description here

J'espère que ça aide...!

4
Strider

Comme ce problème existe toujours, j'ai pensé ajouter quelque chose à réponse de RacZo à des fins de développement. Si vous n'utilisez pas le plugin Eclipse ou pour une raison quelconque, vous n'avez pas le source, mais seulement le fichier .apk, vous pouvez augmenter la taille de la partition à partir de la ligne de commande en utilisant la même option lorsque vous lancez l'émulateur:

emulator -avd <emulator name> -partition-size 1024

Autant que je sache, cette option n'est pas documentée à developer.Android.com, alors j'ai pensé la poster ici pour que les gens puissent trouver cette solution.

3
DrBwaa

J'ai rencontré ce problème avec mon nouveau Nexus 4 et un APK construit avec Adobe AIR. J'avais déjà Android: installLocation = "preferExternal" dans mon manifeste. J'ai remarqué que j'appelais également adb install avec l'option -s (Installer le package sur le stockage de masse partagé tel que sdcard.), Ce qui semblait excessif.

La suppression de l'indicateur -s de adb install a résolu le problème pour moi.

3
Sarah Northway

Si vous utilisez un appareil réel, vous n’avez plus que la mémoire interne. Allez simplement sur Android paramètres -> Applications et déplacez certaines applications sur la carte SD ou désinstallez-les.

Si vous utilisez l'émulateur, voir réponse de RacZo .

2
marmor

Je suis tombé sur la même erreur lorsque j'ai essayé d'installer par lot environ 50 applications dans le répertoire carte SD en utilisant le ADB Shell après un ROM complet mise à jour:

for x in *.apk; do pm install -r $x; done

Certains d'entre eux ont été installés, mais beaucoup ont échoué avec l'erreur INSTALL_FAILED_INSUFFICIENT_STORAGE. Toutes les applications en échec avaient un espace dans leur nom. Je les ai renommés et réessayé. Tout a fonctionné cette fois. Je n'ai pas fait de redémarrage ou quoi que ce soit. Peut-être que ce n'est pas le problème auquel vous êtes confrontés, mais cela pourrait aider quelqu'un qui cherche avec le même problème que moi.

2
Insilico

Il suffit de désinstaller l'application de l'émulateur à partir de la ligne de commande ou d'aller dans les paramètres et de désinstaller l'application. Cela empêchera l'erreur de venir.

2
Nagendra

J'ai essayé ce qui suit:

  • Redémarrage de mon appareil
  • Supprimé précédent APK
  • Reconstruire mon APK
  • Désinstaller ma copie précédente dans l'appareil
  • Réinstaller

Vérifiez si cela fonctionne la même chose avec vous.

2
CoolRunning

Je suis tombé sur cette question parce que je rencontrais cette erreur en utilisant le Sideload Wonder Machine pour installer des applications sur mon téléphone actuel. J'ai trouvé que le problème était que j'avais plusieurs fichiers .apk dans le répertoire/payload. Je pensais que c'était quelque chose qui était supporté, mais quand j'ai enlevé tout .apk sauf un, l'erreur est partie.

2
KC Baltz

La solution est simple.

Ouvrez le gestionnaire AVD. Éditez votre AVD.

En bas de la section matériel, certaines propriétés sont répertoriées avec "Nouveau ..." et "Supprimer" à droite de celui-ci.

Appuyez sur Nouveau. Sélectionnez la taille de la partition de données. Réglez sur "512 Mo" (le Mo est requis). Et tu as fini. Si vous rencontrez toujours des problèmes, augmentez également votre système et les partitions de cache en utilisant la même méthode.

Tout est documenté ici: http://developer.Android.com/guide/developing/devices/managing-avds.html

1
Zaid Daghestani

Après avoir essayé tout le reste de ce fil, j'ai découvert que mon propre problème était dû au fait que le chemin d'accès au fichier .apk était trop long. Je suis donc allé au répertoire où se trouvait le .apk et a fait:

cd /Very/Long/Path/To/Package/
adb install mypackage.apk

au lieu de

adb install /Very/Long/Path/To/Package/mypackage.apk

Et cela a fonctionné ... bien installé.

Je pensais que cela pourrait aider quelqu'un d'autre.

1
Alma

solution d'émulateur

Ouvrez votre répertoire .Android. Habituellement dans votre répertoire personnel. Ensuite, allez à avd, puis ouvrez le répertoire portant le nom de l'avd que vous souhaitez modifier.

Maintenant, éditez le fichier config.ini et ajoutez la ligne suivante ou modifiez-la:

disk.dataPartition.size=1024

1024 est la taille que vous souhaitez utiliser en Mo. Enregistrez le fichier, puis démarrez votre émulateur en vérifiant que wipe user data est coché. Votre émulateur devrait maintenant avoir la nouvelle taille.

1
prolink007

J'ai eu cette erreur aujourd'hui, lors de l'utilisation de mon téléphone pour tester/déboguer avec Eclipse.

Mon erreur est que j'ai utilisé le caractère spécial norvégien ("æ", "ø", "å") dans le nom de l'application. Lorsque j'ai refacturé le nom de l'application (en utilisant "o" au lieu de "ø"), l'application a été installée correctement.

Probablement pas votre problème, mais pourrait être la note pour d'autres personnes obtenant la même erreur.

1
EirikO

Si vous exécutez votre application sur un émulateur et si le problème persiste, consultez votre gestionnaire de notifications. Si une icône et une notification indiquant que la mémoire du téléphone est saturée, cela signifie que vous avez déjà installé de nombreuses applications sur votre émulateur. Désinstallez plusieurs applications dont vous ne voulez pas actuellement dans "Paramètres> Gérer les applications >> Sélectionnez Application> Désinstaller".
Cet ensemble.
Maintenant, relancez le programme.

1
Rax

Assurez-vous de ne pas connecter votre appareil Android à usb lorsque vous essayez d'exécuter l'émulateur.

1
Sharpless512

Solution de contournement:

Compilez en tant que 2.1 sans Android:installLocation="preferExternal".

D'accord?

Compilez en tant que 2.2, y compris Android:installLocation="preferExternal".

Cela installera toujours sur la version SDK inférieure à 8 (la balise XML est ignorée).

0
Team Pannous

Moi aussi j'ai fait face au même problème et j'ai fait une "réinitialisation des données d'usine", et cela a bien fonctionné par la suite.

0
Monish

Je n'ai pas d'accès root sur mon téléphone et je ne suis pas prêt à installer mon application sur la carte SD. 15 Mo d’espace sont disponibles sur /data/ et mon application ne dépasse pas 2 Mo.

Pendant un moment je me suis débrouillé; nettoyer le projet Eclipse et redémarrer le téléphone, mais cela a fini par cesser de fonctionner (probablement après une mise à jour).

Nettoyer le cache de mon application a résolu le problème pour moi et ne nécessite pas de redémarrage du téléphone ni de désinstallation de l'application.

Il existe des applications sur le marché que vous pouvez utiliser pour effacer le cache de plusieurs applications à la fois. Recherchez "clean".

0
J0hnG4lt

Dans mon cas, cela a été corrigé en augmentant la mémoire étendue d'Eclipse, en modifiant la valeur de - Xmx768m dans Eclipse.ini

0
santhosh

Cela prend un peu de temps, mais cela devrait marcher dans tous les cas:

Connectez-vous via USB et activez le stockage USB. Copiez le fichier APK de votre version locale vers le téléphone (vous devrez peut-être autoriser les sources inconnues dans les paramètres de l'application).

Ensuite, appuyez simplement sur le fichier APK et Android l'installera. Comme je l'ai dit, cela prend du temps, mais cela peut être plus rapide que de redémarrer de temps en temps.

0
jcfrei

J'ai fini par désinstaller l'application de l'appareil, puis je l'ai réinstallée dans Eclipse. C'est un problème que j'obtiens tout le temps sur mon appareil avec une utilisation régulière, mais aujourd'hui, j'ai reçu ce message du développement.

0
Roberto