629 Stimmen

Lösung für den Fehler INSTALL_FAILED_INSUFFICIENT_STORAGE auf Android

El INSTALL_FAILED_INSUFFICIENT_STORAGE Fehler sind der Fluch des Lebens eines jeden Android-Entwicklers. Er tritt unabhängig von der Größe der App oder dem verfügbaren Speicherplatz auf. Ein Neustart des Zielgeräts behebt das Problem kurzzeitig, aber es tritt bald wieder auf. Es gibt Hunderte (wenn nicht Tausende) von Beiträgen in Message Boards von Leuten, die fragen, warum das Problem auftritt, aber die Leute bei Google schweigen frustrierend zu diesem Problem.

Es gibt eine einfache Abhilfe. Wenn Ihr Testgerät mit Android 2.2 oder höher läuft, fügen Sie die android:installLocation Attribut in der Manifestdatei Ihrer Anwendung mit dem Wert "preferExternal" . Dadurch wird die Installation der App auf dem externen Speicher des Geräts, z. B. auf der SD-Karte des Telefons, erzwungen.

Zum Beispiel:

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

Dies ist eher ein Notbehelf als eine Lösung, und es ist vielleicht nicht ideal, wenn Sie möchten, dass Ihre fertige App im internen Speicher des Geräts installiert wird. Aber es wird zumindest den Entwicklungsprozess viel weniger frustrierend machen.

229voto

gabcas Punkte 162

Dies ist nur eine vorübergehende Abhilfe und keine echte Lösung.

Nachdem mir das passiert war und ich mit den aktuellen Antworten nicht zufrieden war, machte ich mich an die Arbeit und versuchte, das Problem anhand der AOSP-Quelle zu lösen. Ich habe eine gefunden REAL Lösung.

Erläuterung

Zunächst einmal ein paar (vereinfachte) Hintergrundinformationen zur Android Installationen und Aktualisierungen

Das erste Mal, dass eine App installiert wird:

  1. El APK Datei wird gespeichert als

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

Wann die App aktualisiert werden soll:

  1. Die aktualisierte APK-Datei wird als gespeichert:

    /data/app/<full.package.name>-2.apk (2.apk)
  2. Die erste Version (1.apk) wird gelöscht.

Über unsere nächste(n) Aktualisierung(en):

  1. Die neue APK wird als (1.apk) gespeichert und (2.apk) wird gelöscht (für immer wiederholen).

Das Problem, das die meisten von uns haben, tritt auf, wenn die Anwendung aktualisiert wird, aber das Löschen der alten APK scheitert. Dies führt noch nicht dazu, dass die Aktualisierung fehlschlägt, aber es führt dazu, dass es zwei APK-Dateien in /data/app .

Wenn Sie das nächste Mal versuchen, die App zu aktualisieren, kann das System die temporäre Datei nicht verschieben, da weder (1.apk) noch (2.apk) leer sind. Da File#renameTo(File) keine Ausnahme auslöst, sondern stattdessen einen booleschen PackageManager zurückgibt, gibt es keine Möglichkeit zu sagen, warum INSTALL_FAILED_INSUFFICIENT_STORAGE zurückgegeben wird, obwohl der Fehler nichts mit der Menge des freien Speichers zu tun hatte.

Lösung

Laufen:

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

OR

Deinstallieren Sie die App

Verwenden Sie Ihre bevorzugte Methode zum Löschen BEIDE :

/data/app/<voll.paket.name>-1.apk

/data/app/<voll.paket.name>-2.apk

Stellen Sie sicher, dass nichts anderes zukünftige Installationen auf ähnliche Weise blockiert. In meinem Fall hatte ich eine /data/app-lib/<full.package.name>-1 Verzeichnis, das in der Nähe verweilt! In diesem Fall ist eine Installation in das Verzeichnis SD-Karte funktionierte, und auch eine spätere Umstellung auf den internen Speicher. (Erstellen /data/app-lib/<full.package.name> ohne die -1 Ende).

Warum andere "Lösungen" funktionierten

  • Der Code für die Installation auf einem externen Speicherplatz unterscheidet sich erheblich von den anderen, die nicht die gleichen Probleme haben

  • Die Deinstallation der App löscht nur eine Version der APK-Datei in /data/app . Deshalb können Sie es einmal neu installieren, aber nicht aktualisieren.

  • Die Menge an freiem Speicherplatz in einem Emulator ist nicht wirklich relevant, wenn dieser Fehler auftritt

123voto

Oscar Salguero Punkte 9991

Sie müssen die Speicherkapazität des Android-Emulators erhöhen. Dafür gibt es zwei Möglichkeiten:

  1. Klicken Sie mit der rechten Maustaste auf die Wurzel Ihres Android-Projekts, gehen Sie auf "Ausführen als" und dann auf "Konfigurationen ausführen...". Suchen Sie den Knoten "Android Application" in der Baumstruktur auf der linken Seite, wählen Sie Ihr Projekt aus und gehen Sie auf die Registerkarte "Target" auf der rechten Seite des Fensters. Suchen Sie das Feld "Additional Emulator Command Line Options" (manchmal müssen Sie das Fenster vergrößern) und fügen Sie dort "-partition-size 1024" ein. Klicken Sie auf "Übernehmen" und dann auf "Ausführen", um Ihren Emulator zu verwenden.

  2. Aller à Eclipse's Einstellungen, und wählen Sie dann "Starten" Fügen Sie "-partition-size 1024" in das Feld "Standard-Emulatoroption" ein. Klicken Sie auf "Übernehmen" und verwenden Sie Ihren Emulator wie gewohnt.

30voto

Louis Semprini Punkte 3035

Danke, dass Sie diese Frage gestellt haben. Ich habe einige zusätzliche Erkenntnisse, die einigen Entwicklern helfen könnten.

Ich debugge meine Anwendung auf einem Gerät (nicht im Emulator). Das Gerät hat 21 MB freien Speicherplatz /data (wie "df" beim Ausführen von "adb shell" zeigt) und meine App ist nur 5 MB groß. Ich habe jedoch festgestellt, dass INSTALL_FAILED_INSUFFICIENT_STORAGE für eine Weile verschwindet und dann zurückkommt, wenn ich andere Apps auf dem Gerät lösche (ohne das Telefon neu zu starten oder adbd neu zu starten).

Es scheint also, dass das Debuggen meiner 5 MB großen Anwendung mehr als 20 MB Speicherplatz in /data und außerdem war jedes Mal etwas undicht, wenn ich meine Anwendung debuggte.

Also rief ich "adb shell" auf und listete die GESAMTE /data Verzeichnis mit

cd /data
ls -a -l -R

Und ich habe mir die 5000-Zeilen-Ausgabe angesehen, um zu sehen, wohin der ganze Platz geht.

Ich entdeckte Unmengen an verschwendetem Speicherplatz auf meinem Gerät in der /data/klog Verzeichnis in Form von alten Protokolldateien aus monatelangen Debugging-Sitzungen.

Dies waren nicht meine Protokolldateien: Sie wurden von einem Teil der Android-Infrastruktur erstellt.

Ich löschte sie und sparte sofort 58 MB, die in der App "Einstellungen" keiner bestimmten App zugewiesen waren. Ich habe ein kleines Gerät, daher sind 58 MB sehr wichtig (etwa 40 %).

Bisher habe ich INSTALL_FAILED_INSUFFICIENT_STORAGE auch nach vielen Durchläufen nicht wieder bekommen. Hoffen wir, dass dies das eigentliche Problem war, obwohl der Betreiber andeutet, dass sein Gerät viel Speicherplatz hatte (aber nicht sagte, wie viel).

Hoffentlich können einige von Ihnen auch INSTALL_FAILED_INSUFFICIENT_STORAGE entgehen, indem sie regelmäßig die /data/klog/* .

Oder Sie können zumindest die ls -a -l -R en /data um zu sehen, wohin der ganze Platz geht, falls es tatsächlich ein (verstecktes) Platzproblem gibt.

29voto

Saad Farooq Punkte 12912

Das Folgende hilft:

  • Öffnen Sie eine Shell für das Gerät

    adb shell
  • Navigieren Sie zu dem temporären Verzeichnis, in das die eingehende APK zuerst kopiert wird

    cd /data/local/tmp
  • Die verfügbaren Dateien auflisten und nach Wunsch löschen

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

Das hat sich bei mir bisher auf einem aktuellen Gerät bewährt.


EDIT: Diese Lösung erwies sich als nicht so zuverlässig wie die oben beschriebene.

Ich habe eine Reihe von Lösungen ausprobiert. Nichts hat wirklich geholfen. Schließlich fand ich eine App namens SD Dienstmädchen . Das hat geholfen.

Es heißt, dass die Funktionalität auf nicht gerooteten Geräten eingeschränkt ist. Mein ist verwurzelt, so wäre es gut zu sehen, hören von Menschen effektiv ist es in diesen Szenarien und wenn es nur ein Zufall war, dass es für mich gearbeitet (es ist ein unvorhersehbares Problem sowieso).

HINWEIS: Ich habe nichts mit der App zu tun. Ich habe sie nur über eine Suche gefunden.

28voto

Ich habe das Problem gelöst, indem ich Folgendes hinzugefügt habe android:installLocation="auto" innerhalb <manifest> Tag in der Datei AndroidManifest.xml.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X